2017-05-30 14 views
2

私はプログラムを持っており、異なる入力サイズの実行時間(壁掛け)を測定したいと思っています。実行時間の測定 - プログラムコードまたはシェルでの測定?

私は、CPU分岐予測子、レジスタ名変更、投機実行、アウトオブオーダー実行などの理由で、ソースコード内でclock_gettimeを使用しても信頼性がないと読んでいます。私が置いた場所以外のどこかでclock_gettimeコールを移動することができます。

しかし、私が読んだこれらの質問は、特定の機能の時間を測定することに関するものでした。プログラム全体(すなわち、main機能)を測定している場合、これらの問題は依然として存在するでしょうか?私は絶対的な値ではなく、異なる入力サイズに対して実行時間がどのように変化するか、相対的な測定を探しています。

どうすればより良い結果が得られますか?コード内のタイミング機能を使用:

bash
start = clock_gettime(); 
do_stuff(); 
end = clock_gettime(); 
execution_time = end - start; 

またはtimeコマンドで:

time ./program 

答えて

1

プログラムで測定することは、あなたに、より正確な答えを与えます。確かに、理論上、場合によっては、あなたが期待していないところでclock_gettimeコールを移動させることができます。実際には、間に関数呼び出ししかない場合は発生しません。疑問がある場合は、結果のアセンブラコードを確認してください。

シェル内にtimeを呼び出すと、実行ファイルを読み込んで面白いところに移動するのにかかる時間のように気にしないことが含まれます。一方、do_stuffに数秒かかる場合は、それほど重要ではありません。

私は、次の推奨事項でいいと思う:

  • を簡単にあなたの機能を分離し、それが数秒かかることができます場合は(あなたは、ループ、それは、しかし、同様に、比較のために、空のループを測定することができます)、 clock_gettimeまたはtimeのいずれかが問題ありません。
  • 簡単に分離することはできませんが、機能に一貫して数百ミリ秒かかる場合は、clock_gettimeを使用してください。
  • 分離できず、小さなものを最適化している場合は、実際に実行されたサイクルを測定する方法についてはrdtsc timing for a measuring a functionをご覧ください。
+0

「隔離して数秒かかる」とはどういう意味ですか?すべての繰り返しをスリープコールに追加する必要がありますか? – devil0150

+0

@ devil0150間違いなく!私は、実行時間がランダム遅延/コンテキストスイッチ/キャッシュを満たす/よりも長いことを意味するループを十分に繰り返します。測定されたコードの実行時間が通常10msで異なる場合、または何かの理由で10msだけ遅延することがあります同時にスワップすることに決めた場合は、コードを1秒間実行してエラーを無視してください。また、何百回も実行することができ、各実行を正確に測定し、最低の時間を選択することもできます。 – viraptor

関連する問題