ここに興味深い記事があります!RDTSC を使用しないで、代わりにQueryPerformanceCounterを使用するように指示します。
結論:
timeGetTime()
多くの Windows ベースのオペレーティング システムでは、システム タイマーの粒度が 10 ~ 15 ミリ秒に達する可能性があるため、
通常の old to do タイミングの使用は信頼できませんtimeGetTime()
。[Windows NT、2000、および XP などの NT ベースのオペレーティング システムでは、高い粒度が発生することに注意してください。Windows 95 および 98 は、約 1 ~ 5 ミリ秒という、はるかに優れた粒度を持つ傾向があります。]
timeBeginPeriod(1)
ただし、プログラムの開始時 (および timeEndPeriod(1)
終了時) にを呼び出す
と、timeGetTime()
通常は 1 ~ 2 ミリ秒の精度になり、非常に正確なタイミング情報が提供されます。
Sleep()
同様に動作します。実際にスリープする時間の長さはSleep()
の粒度と密接に関係しているため、 1 回
timeGetTime()
呼び出した後 、実際には 1 ~ 2 ミリ秒、2 ~ 3 ミリ秒、というようにスリープします ( 10 ~ 15 ミリ秒)。timeBeginPeriod(1)
Sleep(1)
Sleep(2)
精度の高いタイミング (ミリ秒未満の精度) を得るには、キャリブレーションが難しいため、アセンブリ ニーモニック RDTSC の使用を避けた方がよいでしょう。代わりに、
10 マイクロ秒 (0.00001 秒) 未満の精度の と を QueryPerformanceFrequency
使用し
ます。QueryPerformanceCounter
単純なタイミングでは、timeGetTime と QueryPerformanceCounter の両方が適切に機能し、QueryPerformanceCounter の方が明らかに正確です。ただし、何らかの「時間指定の一時停止」(フレームレート制限に必要なものなど) を行う必要がある場合は、QueryPerformanceCounter を呼び出して特定の値に達するまで待機するループに陥らないように注意する必要があります。これにより、プロセッサが 100% 消費されます。代わりに、1 ミリ秒を超える時間を渡す必要があるときはいつでも Sleep(1) を呼び出し (最初に timeBeginPeriod(1) を忘れないでください!)、次に QueryPerformanceCounter 100% ビジー ループのみに入るハイブリッド スキームを検討してください。必要な遅延の最後の 1/1000 秒未満を終了します。これにより、CPU 使用率を最小限に抑えながら、非常に正確な遅延 (10 マイクロ秒までの精度) が得られます。