変更することなく常にゼロに等しい変数A、関数F、関数G、関数Hをお持ちで、最新のIntelデスクトッププロセッサで次のコードを呼び出しますGCCの最新バージョンでの-O3最適化:C++のパフォーマンスを説明できません
for(i = 0; i < a_big_number; i++)
{
if(A != 0) F();
else G();
}
実行に2秒かかります。 Aは常に0なのでFは決して呼び出されないことに注意してください。あるいは、
for(i = 0; i < a_big_number; i++)
{
if(A != 0) H();
else G();
}
は実行に1秒かかります。再び、Aは常に0であり、Hは決して呼び出されない。最後に、
for(i = 0; i < a_big_number; i++)
{
G();
}
の実行には0.5秒しかかかりません。
最初の2つの例の条件文を考えると、FとHの内容はどうなるのですか?彼らは決して呼び出されないので、なぜ彼らは何をするのですか?また、インテルプロセッサーは洗練された分岐予測を持っているので、G()が常に呼び出され、条件文で時間を無駄にすることはありません。私は、条件付き命令は時間を無駄にしなければならないと理解していますが、なぜそれがあまりにも多くの時間を無駄にするのか分かりません。
相対的なパフォーマンスを示す完全でシンプルでコンパイル可能なスタンドアロンの例を提供してください。 (また、数秒以内に実行されるベンチマークは、非常にノイズの多い結果をもたらす可能性が非常に高く、性能差の原因を突き止める最も良い方法は、しばしば生成されたアセンブリを見ることです。 ) –
なぜ比較文はゼロ時間かかりますか?もしGCCがそれを最適化するのに十分な情報を持っていなければ、あなたのCPUサイクルが進みます。 – dasblinkenlight
F、G、またはHのいずれかが 'inline'宣言されていますか? Aは 'const'と宣言されていますか?これらの3つのコードフラグメントは単一の 'main'に出現しますか?後者に関しては、キャッシュはパフォーマンスの違いのいくつかを説明するかもしれません。 3つのコードブロックを並べ替えてみてください。 –