2013-07-17 73 views
1

在以下程序中,我嘗試測量作業的執行時間(for循環)。大多數情況下,它可以正常工作,但有時候,它會返回負值!我的第一個猜測是變量可能會溢出。任何人都可以請讓我知道我是否正確?我該如何解決這個問題?獲取負值使用clock_gettime

感謝

int main(int argc, char **argv) 
{ 
long int ST; 
long int ET; 
struct timespec gettime_now; 
clock_gettime(CLOCK_REALTIME, &gettime_now); 
ST= gettime_now.tv_nsec; 
for (i=0; i < 1000; i++) 
    a[i]=b[i]; 
clock_gettime(CLOCK_REALTIME, &gettime_now); 
ET= gettime_now.tv_nsec; 
printf("Time diff: %ld\n", ET-ST); 
} 
+0

請參閱: http://stackoverflow.com/questions/17659867/how-can-i-check-how-many-times-a-function-was-called-with-a-3-seconds-間隔/ 如何計時功能。 –

回答

5

您在這兩種情況下忽略的struct timespectv_sec,只是使用毫微秒這是不一樣ST正確和EV的tv_nsec可能是不同的第二年代。

man從,

tv_sec - 表示紀元以來秒

tv_nsec - 納米第二精密電流第二(1000000000分之1秒)

這是更好地寫自己函數來查找差異。示例代碼(未測試),

timespec diff(timespec start, timespec end) 
{ 
    timespec temp; 

    if ((end.tv_nsec-start.tv_nsec)<0 
    { 
      temp.tv_sec = end.tv_sec-start.tv_sec-1; 
      temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; 
    } 
    else 
    { 
      temp.tv_sec = end.tv_sec-start.tv_sec; 
      temp.tv_nsec = end.tv_nsec-start.tv_nsec; 
    } 
    return temp; 
} 

參見this實際diff功能和示例。

+0

我相信我所測量的工作不到1秒。所以,我忽略了tv_sec部分。 – user2517676

+0

是的,你是對的....只是理解。我會給它一個鏡頭,然後在這裏報告結果。 – user2517676

+0

已解決。再次感謝 – user2517676