2013-12-10 20 views
1

由於已經有一段時間了(例如,見old question,以及當你谷歌的時候彈出的bug報告),clock_gettime()似乎不會單調地報告返回時間。爲了排除任何愚蠢的錯誤,我可能會監督,這裏是有關的代碼(摘自較大的程序):clock_gettime()仍然不單調 - 替代方案?

<include time.h> 

long nano_1, nano_2; 
double delta; 
struct timespec tspec, *tspec_ptr; 

clock_gettime(CLOCK_MONOTONIC_RAW, tspec_ptr); 
nano_1 = tspec.tv_nsec; 
sort_selection(sorted_ptr, n); 
clock_gettime(CLOCK_MONOTONIC_RAW, tspec_ptr); 
nano_2 = tspec.tv_nsec; 
delta = (nano_2 - nano_1)/1000000.0; 
printf("\nSelection sort took %g micro seconds.\n", (double) delta); 

排序小數組(約1000元)報告可信倍。當我使用3種排序算法對較大的排序(10,000+)進行排序時,3中的1-2排除負排序時間。我嘗試了手冊頁中提到的所有時鐘類型,不僅CLOCK_MONOTONIC_RAW - 沒有變化。

(1)我在代碼中忽略了什麼?
(2)clock_gettime()是否可以替代clock_gettime()來以比秒更準確的增量度量時間?我不需要nanonseconds,但是秒數太難以真正幫助。

系統:
- Ubuntu 12.04。
- 內核3.2.0-30
- gcc 4.6.3。
- libc的版本2.15
- 與-lrt

+0

有多大,當它發生的增量?在背景中是否有什麼會使時鐘「運行正常」(如果它知道振盪器比網絡時間稍微快一點,它可以從現在開始減少一小部分時間,然後再調整...) 。如果ms精度足夠了,你可以使用clock()嗎? – Floris

+0

@弗洛里斯:我看到了通常在負數百微秒的負面結果。除了通常的內核進程之外,在後臺沒有什麼應該進行的;在任何情況下,我都會等待結果而不啓動任何其他程序,並且不要認爲我安裝了任何可能會用計時器弄亂的軟件。如果知道安裝特定軟件的bug clock_gettime()出來,知道哪些可能會有所幫助......雖然我懷疑它,因爲除了gtk之外,我不會安裝其他許多軟件。 – gnometorule

+0

http:// stackoverflow上的一些有趣信息。com/questions/12392278/measure-time-in-linux-getrusage -with-clock-gettime-vs-clock-vs-gettimeofday - 你看到了嗎? – Floris

回答

5

編譯這有什麼好做的clock_gettime的單調時鐘實際上並不存在單調(其中可能有現實基礎的神話,但它從未有據可查並且很可能在很久以前就已經修復)。這只是你程序中的一個錯誤。 tv_nsec是一個儲存作爲兩個場的時間值的納秒部分:

  • tv_sec - 整秒
  • tv_nsec - 納秒範圍爲0〜999999999

當然tv_nsec是要跳當tv_sec遞增時,從999999999倒退到0。要計算timespec結構的差異,您需要以秒爲單位獲取1000000000倍的差值,並將其與納秒的差值相加。當然,如果你不先轉換成64位類型,這可能會很快溢出。

+0

好的。我原本對「包裝」有一個評論,但後來認爲 - 這個鐘沒有很長的一段時間,沒有包裝,沒有先生。我沒有注意到代碼只看ns。這絕對是一個錯誤,很可能是正確的答案。 – Floris

+0

這非常有道理。從任何合理數據類型的時代開始,人們無法儲存納秒......我會盡快嘗試,但希望您的答案能夠解決此問題並接受主動。小時代的正確結果應該是一種贈與:我很幸運,他們在第二次開始時都跑完了。如果我在調整代碼時碰到一些值得提問/指出的內容,我會發表評論。 Tyvm。 – gnometorule

+1

做例如'sec = end_sec - start_sec; nsec = end_nsec - start_nsec; if(nsec <0){sec--; nsec + = 1000000000;}'並打印sec和nsec組件。 – nos