Win32 APIには、非常に高解像度のパフォーマンスタイマーの値を照会する関数QueryPerformanceCounterがあります。高解像度パーフォマンスカウンタとは何ですか?
「高解像度パフォーマンスタイマー」とは何ですか?ハードウェアでサポートされていますか?それをサポートしていないシステムは何ですか?
Win32 APIには、非常に高解像度のパフォーマンスタイマーの値を照会する関数QueryPerformanceCounterがあります。高解像度パーフォマンスカウンタとは何ですか?
「高解像度パフォーマンスタイマー」とは何ですか?ハードウェアでサポートされていますか?それをサポートしていないシステムは何ですか?
現在の世代のプロセッサ上のWindows 7では、これはCPU(HPET)内の信頼性の高い高精度(ナノ秒)タイマーです。
以前のバージョンおよび以前の世代のプロセッサでは、これは「何か」であり、かなり多くのことを意味する可能性があります。何か。最も一般的には、RDTSC命令(またはx86でないものと同等のもの)によって返される値であり、信頼性が高くクロックに依存しない場合もあります。 RDTSC(もともとは定義によるが、今はもうない)は時間を測定していないので、サイクルを測定することに注意してください。現在-と-前世代のCPU上で
、RDTSCは、特にモバイルまたは一部のマルチCPU上、事前 -previous世代に、(すなわち、それは時間を測定する今本当にです)通常、信頼性とクロックに依存しませんリグはそうではありません。 「タイマー」は加速および減速し、異なるCPUで異なることさえあり、「時間移動」を引き起こす。
編集:これは本当に問題を解決していませんが、何をするので、それがない場合がある場合、(RDTSCが信頼できるかどうかを伝えるために使用することができCPUID(0x80000007)でconstant tsc
フラグいいえ代替...)。
(8-10歳のような)古いシステムでは、QueryPerformanceCounterに他のタイマーを使用することができます。それらは高解像度を全く持たないかもしれないし、ひどく正確でもない。
高解像度のパフォーマンスカウンタは、通常、起動後に発生したCPUティック数を取得するx86固有の方法であるrdtsc
命令から取得されます。その値は非常に正確で、通常は100nsの精度です。
約16msの精度を持つGetTickCount()
と比較してください。
他のアーキテクチャ(Win32 APIの範囲外ですが、x86ベースの命令セットでのみ実行されるため)では、これを行う方法が異なる場合があります。たとえば、ARMでは、システム制御コプロセッサ(CP15)を使用して同様の処理を実行できます。
+1を使用して何を使用するかを決定するためには、通常、「通常」です。 –
@AlexK - ええ、それは最終的にHALまでです。しかしx86では、rdtsc以外のものを使用する理由はわかりません。なぜなら、それは非常に正確だからです。私が正しく覚えていれば、それは割り込みを実行するために使用されるのと同じソースクロックを使用します。 – Polynomial
@Polynomial:お客様が4〜5歳のCPUを使用していないことが保証されていない限り、RDTSCを使用しないでください。 RDTSCは、必ずしもすべてではなく、正確に正確なものであり、プログラムが実行されているCPUを実際に制御することはできません。 – Damon
Re: "RDTSCは時間を測定せず、サイクルを測定することに注意してください。"ということは、時間を 'freq * ticks'として直接秒単位で計算できることに注意することが重要です。 – Polynomial
@Polynomial:いいえ、できません、freq!= const。今日のシステム(そして過去50年間のほとんどのシステム)では、周波数を動的にスケーリングして電力を節約しています。 – Damon
興味深い。代わりに何がありますか? – Polynomial