私は(C++を使用して)2つの競合するアルゴリズムの実行時間を比較してみてくださいたびに、私はstd::chrono
を使用するが、のように、以前この質問に例えば提案:しかし、私は常にアルゴリズムの実行順序があることことに気づくMeasuring execution time of a function in C++アルゴリズムの実行時間の比較:実行の順序が重要なのはなぜですか?
実行時間に大きな影響を与えました。競合するアルゴリズムのどれが最速と見なされるかを変更することさえあります。たとえば、2つのアルゴリズムalgo1
とalgo2
があるとします。私が比較したい場合があり、ほぼすべてのアルゴリズム1と2の
std::chrono::high_resolution_clock::time_point start0, start1;
std::chrono::high_resolution_clock::time_point end0, end1;
start2 = std::chrono::high_resolution_clock::now();
algo2();
end2 = std::chrono::high_resolution_clock::now();
start1 = std::chrono::high_resolution_clock::now();
algo1();
end1 = std::chrono::high_resolution_clock::now();
auto time_elapsed1 = std::chrono::duration_cast<std::chrono::nanoseconds>(end1 - start1).count();
auto time_elapsed2 = std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - start2).count();
そしてそれ:
std::chrono::high_resolution_clock::time_point start0, start1;
std::chrono::high_resolution_clock::time_point end0, end1;
start1 = std::chrono::high_resolution_clock::now();
algo1();
end1 = std::chrono::high_resolution_clock::now();
start2 = std::chrono::high_resolution_clock::now();
algo2();
end2 = std::chrono::high_resolution_clock::now();
auto time_elapsed1 = std::chrono::duration_cast<std::chrono::nanoseconds>(end1 - start1).count();
auto time_elapsed2 = std::chrono::duration_cast<std::chrono::nanoseconds>(end2 - start2).count();
以下のコードは異なる結果を与える:私は何を意味
は、以下のコードは、ということです。
私の質問は2つ折りです:1)その理由は何ですか?つまり、注文はなぜ問題なのですか? 2)実行時間に関して2つのアルゴリズムを比較するより良い方法がありますか?つまり、より正確でより正確な比較を行うにはどうすればよいでしょうか?
PS:もちろん、私は常にすべてのコンパイラの最適化をテストします。
複数回algoを実行して平均を取得する必要があります。後続の実行に影響を与えるものをキャッシュにロードすることができます。 – NathanOliver
アルゴリズムは、意味のある時間が経過するのに十分長く実行されていることを確認する必要があります。そのことを考えると、注意すべきことはデータのキャッシュであるということです。各algo()を連続して2回実行して、2回目の実行に時間を掛けてください。 – doug
私は、あなたの関数に観察可能な副作用があると仮定します。さもなければ、それらは単純に完全に離れて最適化されてもよい。また、@ NathanOliverが言ったことは、各アルゴリズムを数千回/百万回実行し、平均/平均を得ることです。ベンチマーキングは驚くほど難しい;) –