Windows下獲取高精度時間注意事項


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位數,要幾百年才會歸零)。
 
參考:http://www.cnblogs.com/AnyDelphi/archive/2009/05/14/1456716.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM