2016-08-15 9 views
5

私は(C++を使用して)2つの競合するアルゴリズムの実行時間を比較してみてくださいたびに、私はstd::chronoを使用するが、のように、以前この質問に例えば提案:しかし、私は常にアルゴリズムの実行順序があることことに気づくMeasuring execution time of a function in C++アルゴリズムの実行時間の比較:実行の順序が重要なのはなぜですか?

実行時間に大きな影響を与えました。競合するアルゴリズムのどれが最速と見なされるかを変更することさえあります。たとえば、2つのアルゴリズムalgo1algo2があるとします。私が比較したい場合があり、ほぼすべてのアルゴリズム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:もちろん、私は常にすべてのコンパイラの最適化をテストします。

+4

複数回algoを実行して平均を取得する必要があります。後続の実行に影響を与えるものをキャッシュにロードすることができます。 – NathanOliver

+0

アルゴリズムは、意味のある時間が経過するのに十分長く実行されていることを確認する必要があります。そのことを考えると、注意すべきことはデータのキャッシュであるということです。各algo()を連続して2回実行して、2回目の実行に時間を掛けてください。 – doug

+2

私は、あなたの関数に観察可能な副作用があると仮定します。さもなければ、それらは単純に完全に離れて最適化されてもよい。また、@ NathanOliverが言ったことは、各アルゴリズムを数千回/百万回実行し、平均/平均を得ることです。ベンチマーキングは驚くほど難しい;) –

答えて

1

これはキャッシュの可能性が高いためです。

SAMEアルゴリズムを複数回実行することで、キャッシュの効果を簡単に確認できます。非常に最初の実行に要した時間は、その後の実行よりもかなり長くかかることに気付くでしょう。

私は博士論文のアルゴリズムを2つ比較しなければならなかったが、各アルゴリズムを10回連続して実行し、最初の結果を破棄し、残りの9つの結果を平均して9つの結果が非常に一致した。

私は2つのアルゴリズムの相対的なパフォーマンスを比較することにもっと興味があったので、廃棄された最初の結果が重要かどうかは議論の余地があります。それぞれのアルゴリズム)、異なる状況下でのキャッシュの影響や各アルゴリズムの絶対的なパフォーマンスを測定するのではなく、

+0

私のトリックは、アルゴリズムを何度も実行するだけでなく、初期値を破棄するというあなたの提案でした。実際の解決策が事前に分かっている分析上の問題に対しても、より正確に確認できます。ありがとう! –

関連する問題