3

一部のコードの実行時間を改善したい。

そのために、次のようなコードを使用して、関連するすべてのコードの実行時間を初めて確認します。

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ますか?
または、コード サンプルが中断されないように使用する他のトリックはありますか?

4

2 に答える 2

4

一部のコードの実行時間を改善したい。

そのために、関連するすべてのコードの実行時間を初めて調べます...

OK、私はこの件に関しては記録に固執していますが、多くの人は、実行時間を改善するにはまず正確に測定する必要があると考えています。

そうではない。

実行時間を改善するには、何に多くの時間がかかっているか (正確な割合は問題ではありません) を見つけ、それを別の方法で行うか、まったく行わないことが必要です。それが何をしているかは、個々のルーチンのタイミングによって明らかにされないことがよくあります。

これが私が使用する方法で あり、これは非常にアマチュアなビデオです

于 2013-09-24T14:43:36.467 に答える
3

コードに特別なステートメントを貼り付けて、そのようにコードをプロファイリングする際の問題は、それらの特別なステートメント自体の実行に時間がかかることです。そして、最も時間がかかるのはタイトなループで発生している可能性が高いため、それらが実行されれば実行されるほど、タイミングが歪められます. 良い情報に必要なのは、実行中のコードを変更することなく、プログラムを外部から観察できるものです。

つまり、サンプリング プロファイラーが必要です。そしてたまたま、 Sampling Profilerというわかりやすい名前で、無料で利用できる Delphi 用の非常に優れたものがあります。プログラムを実行し、その動作を監視し、それをマップ ファイルと関連付けて (詳細なマップ ファイルを生成するようにプロジェクト オプションを設定してください)、プログラムが何に時間を費やしているかをわかりやすく表示します。

マップ ファイルの有効化

また、絞り込みたい場合は、OutputDebugString を使用してプロファイリング コマンドを出力し、コードの特定の部分のみに注意を向けさせることができます。ヘルプファイルに説明があります。

私はさまざまな方法を使用してきましたが、これは、Delphi プログラムが何に時間を費やしているかを把握するために見つけた最も有用な方法です。そしてそれは無料です。試してみる。

于 2013-09-24T15:02:02.877 に答える