2012-12-19 43 views
3

裁判:linux clock_gettimeClock_gettime納秒計算

我發現效果很好,以獲得處理時間的公式,但有件事情我不明白。 查看下面的結果。

前2行只是顯示forumla在各自的列中。

我只顯示快速運行的3個結果。
有趣的部分是在最後一行,爲什麼是5551 - 999896062 nanoseconds = 18446744072709661105?
爲什麼18446744072709661105+1/1E9 = 0.000109?

我認爲有一些數據轉換會影響結果嗎?

xx:  | t1.tv_sec | | t1.tv_nsec |   | t2.tv_sec | | t2.tv_nsec 
xx:  t2-t1(sec)  t2-t1(nsec)   (t2-t1(sec))+(t2-t1(nsec))/1E9 

52291: | 30437 | | 999649886 |  | 30437 | | 999759331 
52291: 0 109445   0.000109 

52292: | 30437 | | 999772970 |  | 30437 | | 999882416 
52292: 0 109446   0.000109 

52293: | 30437 | | 999896062 |  | 30438 | | 5551 
52293: 1 18446744072709661105  0.000109 

源代碼:

int main() { 
    struct timespec t1, t2; 

    int i = 0; 
    while(1) { 
     clock_gettime(CLOCK_MONOTONIC, &t1); 
      for(int j=0;j<25000;j++) { }; 
     clock_gettime(CLOCK_MONOTONIC, &t2); 
     printf("%d: \t | %llu | \t | %lu | \t\t | %llu | \t | %lu \n", i, (unsigned long long) t1.tv_sec, t1.tv_nsec, (unsigned long long) t2.tv_sec, t2.tv_nsec); 
     printf("%d: \t %llu \t %lu \t\t %lf\n", i, (unsigned long long) t2.tv_sec - t1.tv_sec, t2.tv_nsec - t1.tv_nsec, (t2.tv_sec - t1.tv_sec)+(t2.tv_nsec - t1.tv_nsec)/1E9); 
     if ((t2.tv_sec - t1.tv_sec) == 1) break; 
     i++; 
    } 
    return 0; 
} 
+0

你爲什麼不'clock_gettime()'的結果轉換爲納秒的64位數字?讓生活變得如此簡單。 –

回答

4

由於5551 - 999896062是一些負值,存儲在類型長的臨時變量,而是由printf的解釋爲「無符號長」由於%lu個轉化符。

請注意,struct timespec中的tv_nsec字段的類型是long,而不是unsigned long。同樣,在Linux和其他Unix系統上,time_t是有符號整數類型的typedef。所以擺脫你的代碼中的所有未簽名的東西。

順便說一句,對2個。減去實例的timespec的方式是


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; 
} 
+0

我認爲你的解決方案是一個C++解決方案?但無論如何,你對未簽名的長打印格式是正確的。改變了這一點,它返回了我可以手動驗證結果的正確數字。謝謝。 只是好奇,如何驗證納秒精度,因爲沒有物理介質來衡量它。 CLOCK_MONOTONIC是如何工作的?請閱讀它代表自1970年以來的新紀元時間。但是,如何驗證其納秒精度? 所有機器都一樣嗎? – resting

+0

@resting:對,我從一些我躺着的C++代碼複製粘貼它。但是如果將「timespec」更改爲「struct timespec」,它應該以純C方式工作。 – janneb

+0

@resting:CLOCK_MONOTONIC表示從過去某個未指定的時間(例如,Linux零點被設置爲系統引導時間之前的某個時間)開始的時間,並且是單調的,即不會改變,例如,如果系統時鐘改變了。 CLOCK_REALTIME表示從時代開始的時間。 – janneb