Windows下獲取高精度時間注意事項 [轉貼 AdamWu]
花了很長時間才得到的經驗,與大家分享。
1. RDTSC - 粒度: 納秒級 不推薦
優勢: 幾乎是能夠獲得最細粒度的計數器
拋棄理由:
A) 定義模糊
- 曾經據說是處理器的cycle counter,但是后來似乎又不是了。
有的機器上每秒的TSC增長值等於CPU頻率,有的卻是一個不對應任何配置的數。到底是什么,Intel也沒解釋清楚。
B) 不准確
- 這是最重大的缺陷。再細的粒度,不准的話也沒用,至少不能當時間用。
在有的CPU上,特別是支持變頻技術的筆記本CPU上,TSC增長值會隨着CPU的頻率改變。忙的時候跑得快,閑得時候跑得慢。
2. QueryPerformanceCounter - 粒度: 1~100微秒級 不推薦
優勢: 盡管比RDTSC粒度稍低,但是不存在RDTSC在變頻CPU上的問題。
知道這個API的人估計都傾向於用這個,因為M$對這個API給出了比較明確的定義,就是每秒鍾某個計數器增長的數值。
拋棄理由: 還是不准確
盡管沒有源代碼,但是從M$的幫助文檔和知識庫可以了解到,PerformanceCounter是依賴於主板上與PCI設備有關聯的硬件。這就意味着,PerformanceCounter的結果還是會受到硬件頻率,特別是總線頻率的影響。
事實上,我在EeePC上測試的時候就發現,系統采用節能模式的時候PerformanceCounter出來的結果老是偏慢很多,超頻模式的時候又偏快,而且用電池和接電源的時候效果還不一樣!
3. timeGetTime - 粒度: 毫秒級 推薦
盡管粒度進一步降低,但是其 無與倫比的優勢就是,准確。
在任何機器上返回的都是當前系統的啟動時間,精確到1毫秒。
使用注意事項:
A) 在NT系統上(據說)默認精度為10ms,但是可以用timeBeginPeriod來降低到1ms
B) 返回的是一個32位整數,所以要注意大約每49.71天會出現歸零(不像前兩個是64位數,要幾百年才會歸零)。
1. RDTSC - 粒度: 納秒級 不推薦
優勢: 幾乎是能夠獲得最細粒度的計數器
拋棄理由:
A) 定義模糊
- 曾經據說是處理器的cycle counter,但是后來似乎又不是了。
有的機器上每秒的TSC增長值等於CPU頻率,有的卻是一個不對應任何配置的數。到底是什么,Intel也沒解釋清楚。
B) 不准確
- 這是最重大的缺陷。再細的粒度,不准的話也沒用,至少不能當時間用。
在有的CPU上,特別是支持變頻技術的筆記本CPU上,TSC增長值會隨着CPU的頻率改變。忙的時候跑得快,閑得時候跑得慢。
2. QueryPerformanceCounter - 粒度: 1~100微秒級 不推薦
優勢: 盡管比RDTSC粒度稍低,但是不存在RDTSC在變頻CPU上的問題。
知道這個API的人估計都傾向於用這個,因為M$對這個API給出了比較明確的定義,就是每秒鍾某個計數器增長的數值。
拋棄理由: 還是不准確
盡管沒有源代碼,但是從M$的幫助文檔和知識庫可以了解到,PerformanceCounter是依賴於主板上與PCI設備有關聯的硬件。這就意味着,PerformanceCounter的結果還是會受到硬件頻率,特別是總線頻率的影響。
事實上,我在EeePC上測試的時候就發現,系統采用節能模式的時候PerformanceCounter出來的結果老是偏慢很多,超頻模式的時候又偏快,而且用電池和接電源的時候效果還不一樣!
3. timeGetTime - 粒度: 毫秒級 推薦
盡管粒度進一步降低,但是其 無與倫比的優勢就是,准確。
在任何機器上返回的都是當前系統的啟動時間,精確到1毫秒。
使用注意事項:
A) 在NT系統上(據說)默認精度為10ms,但是可以用timeBeginPeriod來降低到1ms
B) 返回的是一個32位整數,所以要注意大約每49.71天會出現歸零(不像前兩個是64位數,要幾百年才會歸零)。
參考:http://www.cnblogs.com/AnyDelphi/archive/2009/05/14/1456716.html
