これは本当に基本的な質問のように思えるかもしれませんが、
QueryPerformanceCounter
を使用するQueryPerformanceFrequency
と、結果の値は何秒、ミリ秒、マイクロ秒になりますか?
一部のコードをWindowsからLinuxに移植していて、実験に便利なWindowsマシンがないため、質問しています。いくつかのグーグルは私に具体的な答えを提供しませんでした。
QueryPerformanceCounterのドキュメントを更新しましたが、上記のRDTSCとQueryPerformanceCounterの精度の比較は正しくありません。詳細については、を参照してください。
http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
エドブリッグスマイクロソフトコーポレーション
いくつかのグーグルは私に具体的な答えを提供しませんでした。
「QueryPerformanceCounter」の最初のGoogle検索結果:MSDNドキュメントQueryPerformanceCounter()
これがそれが言わなければならないことです:
パラメーター
lpPerformanceCount [out]
タイプ:LARGE_INTEGER *
現在のパフォーマンスカウンター値をcountsで受け取る変数へのポインター。
「QueryPerformanceFrequency」の最初のGoogle検索結果:MSDNドキュメントQueryPerformanceFrequency()
これがそれが言わなければならないことです:
パラメーター
lpFrequency [out]
タイプ:LARGE_INTEGER *
現在のパフォーマンスカウンターの頻度を1秒あたりのカウント数で受け取る変数へのポインター。インストールされているハードウェアが高解像度のパフォーマンスカウンターをサポートしていない場合、このパラメーターはゼロになる可能性があります。
から取得した値QueryPerformanceCounter()
はカウントです。から取得される値QueryPerformanceFrequency()
は、1秒あたりのカウント数です。少しの次元分析を使用して:
(counts) / (counts/second) = seconds
したがって、2つの値を除算した結果は秒単位になります。
少なくとも私が知る限り、QPFは通常2つのソースのいずれかに依存します。少なくとも一度は、ほとんどのシングルプロセッサシステムは、RDTSC命令を介してアクセスされるプロセッサのタイムスタンプカウンタレジスタを使用していました。
マルチプロセッサシステム(およびTSCレジスタを持たない古いシステム)は通常、マザーボードのオンボード1.024MHzクロックを使用します。マルチプロセッサ/マルチコアシステムでは、プロセッサ/コアのタイムスタンプカウンタが同期していない可能性があるため、タイムスタンプカウンタはかなり意味のない結果(負の期間を含む)をもたらす可能性があります。
Windows 7では、の結果を生成する新しい方法が導入されましたQueryPerformanceCounter
。
この関数は可能な限り細かい粒度であると想定されていますが、その精度を確認する必要があります。によって返される値QueryPerformanceFrequency
は、正確に観測されたものでも、定数でもありません。特に古いシステムは、深刻な熱ドリフトに悩まされています。
私はここにもう少し詳細を書きました。
インシリコが質問に答えたとしても、より高いタイマー解像度を探している場合は、rdtsc
アセンブリ命令を使用できます。(マザーボードのクロックとは対照的に)CPUクロックを使用するため、約rdtsc
1000倍正確です。メソッドは次のようになります。QueryPerformanceCounter
QueryPerformanceFrequency
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
}
}
おもしろい事実:遅いマザーボードの時計は、水晶振動子が大きいため、クロックドリフトの影響を受けやすくなっています。もちろん、高解像度のタイミングの深さを掘り下げたいかどうかは、アプリケーションでタイミングがどれほど重要かによって異なります。ハッピーコーディング!