他にもいくつかの可能性があります。
QueryPerformanceCounterおよびQueryPerformanceFrequency
QueryPerformanceCounterは、「パフォーマンスカウンター」を返します。これは、実際には、コンピューターの電源投入時に0から増分するCPU管理の64ビットカウンターです。このカウンターの頻度は、QueryPerformanceFrequencyによって返されます。時間基準を秒単位で取得するには、パフォーマンスカウンターをパフォーマンス頻度で割ります。Delphiの場合:
function QueryPerfCounterAsUS: int64;
begin
if QueryPerformanceCounter(Result) and
QueryPerformanceFrequency(perfFreq)
then
Result := Round(Result / perfFreq * 1000000);
else
Result := 0;
end;
マルチプロセッサプラットフォームでは、QueryPerformanceCounterは、スレッドが現在実行されているCPUに関係なく、一貫した結果を返す必要があります。ただし、通常はハードウェアチップまたはBIOSのバグが原因で問題が発生することがあります。通常、パッチはマザーボードメーカーから提供されます。MSDNからの2つの例:
QueryPerformanceCounterのもう1つの問題は、非常に遅いことです。
RDTSC命令
コードを1つのCPU(SetThreadAffinity)に制限できる場合は、RDTSCアセンブラー命令を使用して、プロセッサーから直接パフォーマンスカウンターを照会できます。
function CPUGetTick: int64;
asm
dw 310Fh // rdtsc
end;
RDTSCの結果は、QueryPerformanceCounterと同じ頻度で増分されます。これをQueryPerformanceFrequencyで除算して、時間を秒単位で取得します。
QueryPerformanceCounterは、複数のCPUと可変周波数のCPUを考慮に入れる必要があるため、RDTSCよりもはるかに低速です。Raymon Chenのブログから:
(QueryPerformanceCounter)は経過時間をカウントします。その値は1秒あたりのユニット数を指定する数値を返すQueryPerformanceFrequency関数によって管理され、システムの実行中に頻度が変化しないように指定されているため、これを行う必要があります。
可変速度で実行できるCPUの場合、これは、経過時間と相関関係がないため、HALがRDTSCのような命令を使用できないことを意味します。
timeGetTime
TimeGetTimeは、Win32マルチメディアWin32関数に属しています。少なくとも最新のハードウェアでは、1ミリ秒の解像度でミリ秒単位の時間を返します。時間の測定を開始する前にtimeBeginPeriod(1)を実行し、終了したらtimeEndPeriod(1)を実行しても問題はありません。
GetLocalTimeおよびGetSystemTime
Vistaより前では、GetLocalTimeと GetSystemTimeの両方がミリ秒の精度で現在の時刻を返しますが、ミリ秒の精度ではありません。それらの精度は通常、10〜55ミリ秒の範囲です。(精度は精度と同じではありません)Vistaでは、GetLocalTimeとGetSystemTimeはどちらも1ミリ秒の解像度で動作します。