2011-12-07 13 views
5

Win32 APIには、非常に高解像度のパフォーマンスタイマーの値を照会する関数QueryPerformanceCounterがあります。高解像度パーフォマンスカウンタとは何ですか?

「高解像度パフォーマンスタイマー」とは何ですか?ハードウェアでサポートされていますか?それをサポートしていないシステムは何ですか?

答えて

4

現在の世代のプロセッサ上のWindows 7では、これはCPU(HPET)内の信頼性の高い高精度(ナノ秒)タイマーです。

以前のバージョンおよび以前の世代のプロセッサでは、これは「何か」であり、かなり多くのことを意味する可能性があります。何か。最も一般的には、RDTSC命令(またはx86でないものと同等のもの)によって返される値であり、信頼性が高くクロックに依存しない場合もあります。 RDTSC(もともとは定義によるが、今はもうない)は時間を測定していないので、サイクルを測定することに注意してください。現在-と-前世代のCPU上で

、RDTSCは、特にモバイルまたは一部のマルチCPU上、事前 -previous世代に、(すなわち、それは時間を測定する今本当にです)通常、信頼性とクロックに依存しませんリグはそうではありません。 「タイマー」は加速および減速し、異なるCPUで異なることさえあり、「時間移動」を引き起こす。

編集:これは本当に問題を解決していませんが、何をするので、それがない場合がある場合、(RDTSCが信頼できるかどうかを伝えるために使用することができCPUID(0x80000007)でconstant tscフラグいいえ代替...)。

(8-10歳のような)古いシステムでは、QueryPerformanceCounterに他のタイマーを使用することができます。それらは高解像度を全く持たないかもしれないし、ひどく正確でもない。

+0

Re: "RDTSCは時間を測定せず、サイクルを測定することに注意してください。"ということは、時間を 'freq * ticks'として直接秒単位で計算できることに注意することが重要です。 – Polynomial

+1

@Polynomial:いいえ、できません、freq!= const。今日のシステム(そして過去50年間のほとんどのシステム)では、周波数を動的にスケーリングして電力を節約しています。 – Damon

+0

興味深い。代わりに何がありますか? – Polynomial

1

高解像度のパフォーマンスカウンタは、通常、起動後に発生したCPUティック数を取得するx86固有の方法であるrdtsc命令から取得されます。その値は非常に正確で、通常は100nsの精度です。

約16msの精度を持つGetTickCount()と比較してください。

他のアーキテクチャ(Win32 APIの範囲外ですが、x86ベースの命令セットでのみ実行されるため)では、これを行う方法が異なる場合があります。たとえば、ARMでは、システム制御コプロセッサ(CP15)を使用して同様の処理を実行できます。

+0

+1を使用して何を使用するかを決定するためには、通常、「通常」です。 –

+0

@AlexK - ええ、それは最終的にHALまでです。しかしx86では、rdtsc以外のものを使用する理由はわかりません。なぜなら、それは非常に正確だからです。私が正しく覚えていれば、それは割り込みを実行するために使用されるのと同じソースクロックを使用します。 – Polynomial

+0

@Polynomial:お客様が4〜5歳のCPUを使用していないことが保証されていない限り、RDTSCを使用しないでください。 RDTSCは、必ずしもすべてではなく、正確に正確なものであり、プログラムが実行されているCPUを実際に制御することはできません。 – Damon

関連する問題