変化せず、常にゼロに等しい変数 A、関数 F、関数 G、および関数 H があり、最新バージョンの GCC で -O3 最適化を使用して最新の Intel デスクトップ プロセッサで次のコードを呼び出すとします。 :
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 の内容が重要なのでしょうか? それらは決して呼び出されないのに、なぜそれらの動作に違いが生じるのでしょうか? また、Intel プロセッサが高度な分岐予測機能を備えていることを考えると、プロセッサは G() が常に呼び出され、条件ステートメントで時間を無駄にすることさえないことを理解すべきではないでしょうか? 条件付き命令が時間を無駄にする必要があることは理解していますが、なぜそんなに時間を無駄にするのかわかりません。