(免責事項:以下は、ほとんどの場合必要のない非常に低レベルの最適化を扱います。読み続けると、コンピューターが高速であり、この種のことを心配する理由がないことを訴える権利を放棄します。)
ステートメントを削除する利点の1つif
は、分岐予測のペナルティを回避できることです。
分岐予測のペナルティは、一般に、分岐が簡単に予測されない場合にのみ問題になります。分岐は、ほとんどの場合、取得される場合と取得されない場合、または単純なパターンに従う場合に簡単に予測できます。たとえば、ループステートメントの分岐は最後の分岐を除いて毎回行われるため、簡単に予測できます。ただし、次のようなコードがある場合
a = random() % 10
if (a < 5)
print "Less"
else
print "Greater"
その場合、このブランチは簡単に予測できず、ブランチの間違った部分で実行されたキャッシュのクリアと命令のロールバックに関連する予測ペナルティが頻繁に発生します。
この種のペナルティを回避する1つの方法は、三項(?:
)演算子を使用することです。単純なケースでは、コンパイラーはブランチではなく条件付き移動命令を生成します。
それで
int a, b, low;
if (a < b) low = a;
else low = b;
になります
int a, b, low;
low = (a < b) ? a : b
2番目のケースでは、分岐命令は必要ありません。さらに、ビットをいじる実装よりもはるかに明確で読みやすくなっています。
もちろん、これはマイクロ最適化であり、コードに大きな影響を与える可能性はほとんどありません。