一般に、timeGetTime()はゲームロジックのタイミングに最適です。GetTickCountの解像度はそれほど高くなく、QPCとRDTSCは、その目的に値するよりもはるかに問題が多くなります。
一方、プロファイリングの場合は、RDTSCまたはQPCのいずれかを使用する価値があります。マイクロソフトではQPCを推奨していますが、QPCよりもRDTSCを好みます。
私がwin32で使用する4つの一般的な時間関数:
GetTickCount()は、任意のゼロ(通常、システムの起動時間とは限りませんが)を基準とした現在の時刻をミリ秒単位で32ビット整数として返します(49日ごとにラップするため)。これは通常、時間を測定する最も速い方法です。残念ながら、それは低解像度です-通常、毎秒64回しか更新しません。一般的な噂に反して、timeBeginPeriod(1)を呼び出しても、テストしたシステムでは解像度が上がりません。ラッピングが心配な場合は、64ビットのバリアントもあります。
timeGetTime()は、任意のゼロを基準にした現在の時刻をミリ秒単位で32ビット値として返します(49日程度でラップされます)。GetTickCountほど高速ではありませんが、それでもかなり合理的です。最初はtimeBeginPeriod(1)を呼び出す必要があるかもしれませんが、それは1ミリ秒まで正確である場合があります。timeGetTimeを使用するには、winmm.libにリンクし、Mmsystem.hを含める必要があります。
QueryPerformanceCounter()は、現在の時刻を64ビット整数として任意の単位で返します。QueryPerformanceFrequency()を呼び出すことでユニットが何であるかを理解でき、ユニットは変更されません(再起動がない場合)。これの基礎となる実装は大きく異なり、各実装には独自の癖やバグがあり、一部のハードウェアで発生する可能性があるため、広く展開されているアプリケーションで使用するのは不愉快です。GetTickCountやtimeGetTimeほど高速ではないものもありますが、非常に低速な実装もあれば、妥当な実装もあります。通常、タイミング分解能は1マイクロ秒より優れていますが、必ずしも優れているとは限りません。
RDTSCは、x86 / x64アセンブリ言語のオペコードであり、CPUサイクルの単位で現在の時刻を返します(つまり、64ビット整数として。コンパイラによっては、組み込み(__rdstc)としてアクセスできます。他のコンパイラでは、インラインasmが必要です。その速度はCPUによって多少異なりますが、通常はかなり妥当です。通常、QueryPerformanceCounterより大幅に高速ですが、GetTickCountほど高速ではありません。残念なことに、QueryPerformanceCounterほど多くはありませんが、低解像度の時間関数よりもはるかに多くの癖があります。コア間の同期が不完全なためにコアを切り替えると、マルチコアCPUで逆方向に実行されることがあり、ユニットを理解するのが難しく、電源管理がCPUクロックのレートを変更するため、タイミングの途中でユニットが変更される場合があります。
これらの4つの方法はそれぞれ、他の3つの方法に比べてドリフトする可能性があることに注意してください。明確な信頼できる時間の流れはありません。