一部のコードの実行時間を改善したい。
そのために、次のようなコードを使用して、関連するすべてのコードの実行時間を初めて確認します。
before:= rdtsc;
myobject.run;
after:= rdtsc;
次に、次のように、関連する部分を拡大して時間を計ります。
procedure myobject.part;
begin
StartTime:= rdtsc;
...
EndTime:= rdtsc;
inc(TotalTime, (EndTime- StartTime));
end;
タイミングをコピーして Excel に貼り付けるコードがいくつかあります。典型的な結果は次のようになります。
(89.8% と 10.2% の合計が 100% になるのは偶然であり、データや質問とは何の関係もありません)
(データが示している場合は、ゼロ除算エラーを回避1
することを意味します)0
と の違いに注意してrun A
くださいrun B
。まだ
何も変更していないので、実行 A と B は同じ実行時間になるはずです。さらに、両方の実行で手順がまったく同じ回数呼び出され
たことを知っていることに注意してください(データは同じで、アルゴリズムは決定論的です)。part
プロシージャの実行時間part
は非常に短いです (何度も呼び出されるだけです)。
これらの短い実行時間 (700 CPU サイクル未満) の間に他のプロセスをブロックする方法があれば、私のタイミングははるかに正確になります。
これらのタイミングの信頼性を高めるにはどうすればよいですか?
CPU を独占して、タイミングが合っているときにのみタスクを実行する方法はありますか?
次のような明白な答えを探しているわけではないことに注意してください:
- 実行中の他のプログラムを閉じる
- ウイルススキャナーを無効にするなど...
私はDelphi現在 Delphi を使用しているため、質問にタグを付けました (そして、この結果を達成するための Delphi 固有のオプションがあるかもしれません)。language-agnosticもっと一般的な方法があるかもしれないので、タグ付けしました。
更新
CPU 命令RDTSC
を使用しているため、CPU スロットリングの影響を受けません。CPU の速度が低下しても、サイクル数は変わりません。
Update2
2 つの回答がありますが、どちらも質問に答えていません...
問題は、これらの実行時間の変更をどのように防ぐかです。コードを 20 回実行し、20 回の実行のうち最も短い実行時間を常に比較する必要がありますか?
または、プログラムの優先順位を に設定しrealtime
ますか?
または、コード サンプルが中断されないように使用する他のトリックはありますか?