2009-09-23 85 views
22

我想計算執行我的程序的某些部分所用的時間(以毫秒爲單位)。我一直在網上查找,但是關於這個話題的信息並不多。你們中的任何人都知道如何做到這一點?以毫秒爲單位計算C程序中的已用時間

+0

與常規線重新標記更多。 – dmckee 2009-09-23 21:45:57

+1

hm ...一週前我沒有回答這個問題:http://stackoverflow.com/questions/1444428/time-stamp-in-the-c-programming-language/1445808#1445808 – Christoph 2009-09-23 22:37:19

回答

2

C庫有一個函數讓你獲得系統時間。捕捉開始和停止時間後,可以計算經過時間。

該函數被稱爲gettimeofday(),您可以查看手冊頁以瞭解要包含的內容以及如何使用它。

0

在Windows上,你可以這樣做:

DWORD dwTickCount = GetTickCount(); 

// Perform some things. 

printf("Code took: %dms\n", GetTickCount() - dwTickCount); 

不是最普通/優雅的解決方案,但好,見效快,當你需要它。

3

gettimeofday函數返回具有微秒精度的時間(如果平臺可以支持,當然):

的函數gettimeofday()函數將 獲取當前時間,表示爲 秒和微秒自Epoch的 ,並將其存儲在由tp指向的timeval 結構中。未指定系統時鐘的 分辨率爲 。

+1

'gettimeofday' isn對於測量兩個事件之間的經過時間非常有用,因爲系統時鐘可能會在事件之間發生變化(例如,通過NTP更新或簡單的管理員操作)。 (雖然有時它*是最好的東西)。 – caf 2009-09-23 23:14:36

4

另一個選項(至少在某些UNIX上)是clock_gettime和相關函數。這些允許訪問各種實時時鐘,你可以選擇一個更高分辨率的時鐘,並丟棄你不需要的分辨率。回答

+1

特別是,'CLOCK_MONOTONIC'時鐘,如果您正在運行的系統支持它('sysconf(_SC_MONOTONIC_CLOCK)> 0')。 – caf 2009-09-23 23:16:28

34

最好的辦法是用一個例子:

#include <sys/time.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 

/* Return 1 if the difference is negative, otherwise 0. */ 
int timeval_subtract(struct timeval *result, struct timeval *t2, struct timeval *t1) 
{ 
    long int diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec); 
    result->tv_sec = diff/1000000; 
    result->tv_usec = diff % 1000000; 

    return (diff<0); 
} 

void timeval_print(struct timeval *tv) 
{ 
    char buffer[30]; 
    time_t curtime; 

    printf("%ld.%06ld", tv->tv_sec, tv->tv_usec); 
    curtime = tv->tv_sec; 
    strftime(buffer, 30, "%m-%d-%Y %T", localtime(&curtime)); 
    printf(" = %s.%06ld\n", buffer, tv->tv_usec); 
} 

int main() 
{ 
    struct timeval tvBegin, tvEnd, tvDiff; 

    // begin 
    gettimeofday(&tvBegin, NULL); 
    timeval_print(&tvBegin); 

    // lengthy operation 
    int i,j; 
    for(i=0;i<999999L;++i) { 
     j=sqrt(i); 
    } 

    //end 
    gettimeofday(&tvEnd, NULL); 
    timeval_print(&tvEnd); 

    // diff 
    timeval_subtract(&tvDiff, &tvEnd, &tvBegin); 
    printf("%ld.%06ld\n", tvDiff.tv_sec, tvDiff.tv_usec); 

    return 0; 
} 
相關問題