Delphi 6 以降では、x86 タイムスタンプ カウンターを使用できます。
これは CPU サイクルをカウントします。1 Ghz プロセッサでは、各カウントに 1 ナノ秒かかります。
それ以上の正確さは得られません。
function RDTSC: Int64; assembler;
asm
// RDTSC can be executed out of order, so the pipeline needs to be flushed
// to prevent RDTSC from executing before your code is finished.
// Flush the pipeline
XOR eax, eax
PUSH EBX
CPUID
POP EBX
RDTSC //Get the CPU's time stamp counter.
end;
x64 では、次のコードは の遅延の影響を受けないため、より正確ですCPUID
。
rdtscp // On x64 we can use the serializing version of RDTSC
push rbx // Serialize the code after, to avoid OoO sneaking in
push rax // subsequent instructions prior to executing RDTSCP.
push rdx // See: http://www.intel.de/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf
xor eax,eax
cpuid
pop rdx
pop rax
pop rbx
shl rdx,32
or rax,rdx
上記のコードを使用して、コードの実行前後のタイムスタンプを取得します。
可能な限り最も正確な方法で、パイのように簡単です。
良い結果を得るには、テストを少なくとも 10 回実行する必要があることに注意してください。最初のパスではキャッシュがコールドになり、ランダムなハードディスクの読み取りと割り込みによりタイミングがずれることがあります。
このことは非常に正確であるため、最初の実行のみを計ると、間違った考えを与える可能性があります.
QueryPerformanceCounter() を使用しない理由は
QueryPerformanceCounter()
、CPU の速度が低下した場合に同じ時間を与え、 CPU のスロットリングを補正します。過熱などでCPUの速度が低下した場合、RDTSCは同じ量のサイクルを提供します。
したがって、CPU が過熱し始めて減速する必要がある場合、QueryPerformanceCounter()
はルーチンに時間がかかっていると言い(これは誤解を招きます)、RDTSC は同じ量のサイクルがかかると言う(これは正確です) .
これは、実時間ではなく、コードが使用する CPU サイクルの量に関心があるためです。
最新のインテル ドキュメントから: http://software.intel.com/en-us/articles/measure-code-sections-using-the-enhanced-timer/?wapkw=%28rdtsc%29
プロセッサ クロックの使用
このタイマーは非常に正確です。3 GHz プロセッサを搭載したシステムでは、このタイマーは 1 ナノ秒未満のイベントを測定できます。[...] ターゲット コードの実行中に周波数が変更された場合、最初と最後の読み取り値が同じクロック周波数を使用して取得されていないため、最終的な読み取り値は冗長になります。この間に発生したクロック ティックの数は正確ですが、経過時間は不明です。
RDTSC を使用しない場合
RDTSC は、基本的なタイミングに役立ちます。シングル CPU マシンでマルチスレッド コードのタイミングを計っている場合、RDTSC は問題なく動作します。複数の CPU がある場合、startcount は 1 つの CPU から取得され、endcount は別の CPU から取得される場合があります。
そのため、RDTSC を使用して、マルチ CPU マシンでマルチスレッド コードを計測しないでください。シングル CPU マシンでは正常に動作し、マルチ CPU マシンでもシングル スレッド コードは正常に動作します。
また、RDTSC は CPU サイクルをカウントすることにも注意してください。ディスク IO やネットワークなど、時間がかかるが CPU を使用しないものがある場合、RDTSC は適切なツールではありません。
しかし、ドキュメントによると、最新の CPU では RDTSC は正確ではありません。RDTSC は時間を追跡するためのツールではなく、CPU サイクルを追跡するためのツール
です。
そのため、それは正確な唯一のツールです。CPU クロックは以前のように絶対的ではないため、時間を追跡するルーチンは最新の CPU では正確ではありません。