簡體   English   中英

windows高性能計數器的分辨率是多少?

[英]What is the resolution of windows high performance counter?

這可能看起來像一個非常基本的問題但是,當分割輸出時

QueryPerformanceCounterQueryPerformanceFrequency ,是什么,即秒,毫秒,微秒所得到的值?

我問,因為我正在將一些代碼從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匯編指令。 rdtscQueryPerformanceCounterQueryPerformanceFrequency准確大約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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM