[英]Computing time on Linux: granularity and precision
我使用不同類型的時鍾來獲取 Linux 系統上的時間:
rdtsc, gettimeofday, clock_gettime
並且已經閱讀了諸如此類的各種問題:
但我有點困惑:
粒度(或分辨率或精度)和准確度不是一回事(如果我是對的......)
例如,在使用“clock_gettime”時,精度為 10 毫秒,因為我得到:
struct timespec res;
clock_getres(CLOCK_REALTIME, &res):
並且粒度(定義為每秒滴答數)為 100 Hz(或 10 ms),正如我在執行時得到的:
long ticks_per_sec = sysconf(_SC_CLK_TCK);
精度以納秒為單位,如上述代碼所示:
struct timespec gettime_now;
clock_gettime(CLOCK_REALTIME, &gettime_now);
time_difference = gettime_now.tv_nsec - start_time;
在下面的鏈接中,我看到這是 Linux 全局粒度定義,最好不要更改它:
http://wwwagss.informatik.uni-kl.de/Projekte/Squirrel/da/node5.html#fig:clock:hw
所以我的問題是,上面的這句話是否正確,以及:
a) 我們可以看到 rdtsc 和 gettimeofday 的粒度是多少(用命令)?
b) 我們可以(以任何方式)改變它們嗎?
我已經測試了一些新的時鍾,我想分享信息:
a) 在下面的頁面中, David Terei做了一個很好的程序,比較了各種時鍾及其性能:
https://github.com/dterei/Scraps/tree/master/c/time
B)我還測試omp_get_wtime作為Raxman所建議的,我發現了一個精密的納秒,但不是真的比“clock_gettime(因為他們在這個網站做的):
http://msdn.microsoft.com/en-us/library/t3282fe5.aspx
我認為這是一個面向 Windows 的時間函數。
與使用 CLOCK_REALTIME 相比,使用 CLOCK_MONOTONIC 的clock_gettime給出更好的結果。 這是正常的,因為第一個分別計算PROCESSING時間和另一個REAL TIME
c) 我還發現了英特爾函數ippGetCpuClocks ,但我沒有測試過它,因為它必須先注冊:
http://software.intel.com/en-us/articles/ipp-downloads-registration-and-licensing/
...或者您可以使用試用版
精度是信息量,即您報告的有效數字的數量。 (例如,我的身高為 2 m、1.8 m、1.83 m 和 1.8322 m。所有這些測量值都是准確的,但越來越精確。)
准確性是報告的信息與真實性之間的關系。 (例如,“我身高 1.70 m”比“1.8 m”更精確,但實際上並不准確。)
粒度或分辨率大約是計時器可以測量的最小時間間隔。 例如,如果您有 1 毫秒的粒度,那么以納秒精度報告結果就沒有什么意義了,因為它不可能准確到那個精度級別。
在 Linux 上,可用的定時器粒度越來越大:
來自<time.h>
clock()
(20 毫秒或 10 毫秒分辨率?)
來自 Posix <sys/time.h>
gettimeofday()
(微秒)
Posix 上的clock_gettime()
(納秒?)
在 C++ 中, <chrono>
標頭為此提供了一定數量的抽象,並且std::high_resolution_clock
嘗試為您提供最佳時鍾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.