[英]What is the resolution of windows high performance counter?
這可能看起來像一個非常基本的問題但是,當分割輸出時
QueryPerformanceCounter
與QueryPerformanceFrequency
,是什么,即秒,毫秒,微秒所得到的值?
我問,因為我正在將一些代碼從Windows移植到Linux,而且我沒有便於試驗的Windows機器。 一些谷歌搜索沒有為我提供具體的答案。
我們更新了QueryPerformanceCounter的文檔,並且上面的RDTSC和QueryPerformanceCounter精度之間的比較並不完全正確。 有關詳細信息,請參閱
http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
Ed Briggs微軟公司
一些谷歌搜索沒有為我提供具體的答案。
“QueryPerformanceCounter”的第一個Google搜索結果: QueryPerformanceCounter()
的MSDN文檔
這就是它的含義:
參數
lpPerformanceCount [out]
類型: LARGE_INTEGER *
指向接收當前性能計數器值的變量的指針, 以計數為單位 。
“QueryPerformanceFrequency”的第一個Google搜索結果: QueryPerformanceFrequency()
的MSDN文檔
這就是它的含義:
參數
lpFrequency [out]
類型: LARGE_INTEGER *
指向接收當前性能計數器頻率的變量的指針, 以每秒計數為單位 。 如果安裝的硬件不支持高分辨率性能計數器,則此參數可以為零。
從QueryPerformanceCounter()
獲得的值是計數。 從QueryPerformanceFrequency()
獲得的值是每秒計數。 使用一些尺寸分析:
(counts) / (counts/second) = seconds
因此,將兩個值分開的結果以秒為單位。
至少據我所知,QPF通常依賴於兩個來源之一。 至少在一次,大多數單處理器系統使用處理器的時間戳計數器寄存器,通過RDTSC指令訪問。
多處理器系統(以及沒有TSC寄存器的舊系統)通常使用主板的板載1.024 MHz時鍾。 在多處理器/多核系統上,處理器/核心的時間戳計數器可能不同步,因此時間戳計數器可能會給出相當無意義的結果(包括負時間段)。
即使In silico回答了這個問題,如果你正在尋找更高的計時器分辨率,你可以使用rdtsc
匯編指令。 rdtsc
比QueryPerformanceCounter
和QueryPerformanceFrequency
准確大約1000倍,因為它使用CPU時鍾(而不是主板時鍾)。 該方法看起來像這樣:
void QueryRDTSC(__int64* tick) {
__asm {
xor eax, eax
cpuid
rdtsc
mov edi, dword ptr tick
mov dword ptr [edi], eax
mov dword ptr [edi+4], edx
}
}
有趣的事實 :由於較大的石英晶體,較慢的主板時鍾也更容易受到時鍾漂移的影響。 當然,無論您是否想要深入研究高分辨率時序的深度,都取決於您的應用程序中的時序重要程度。 快樂的編碼!
Windows 7引入了一種為QueryPerformanceCounter
生成結果的新方法。
假設此函數具有最精細的粒度,但必須考慮其准確性: QueryPerformanceFrequency
返回的值既不是觀察到的值也不是常量。 特別是舊系統遭受嚴重的熱漂移。
我在這里寫了更多細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.