while (condition) {
...
}
ワークフロー:
- チェック状態;
- falseの場合、ループの外側にジャンプします。
- 1回の反復を実行します。
- 先頭にジャンプします。
if (condition) do {
...
} while (condition);
ワークフロー:
- チェック状態;
- falseの場合、ループを超えてジャンプします。
- 1回の反復を実行します。
- チェック状態;
- trueの場合、手順3に進みます。
これら2つを比較すると、ループ全体で1つのステップしかなく、ジャンプの数が反復数より1つ少ない場合、後者はジャンプをまったく行わない可能性があることが簡単にわかります。前者は、条件をチェックするためにジャンプして戻る必要があり、条件が偽の場合にループからジャンプするだけです。
最新のパイプライン化されたCPUアーキテクチャでのジャンプは非常に高価になる可能性があります。CPUはジャンプの前にチェックの実行を終了しているため、そのジャンプを超える命令はすでにパイプラインの途中にあります。分岐予測が失敗した場合、この処理はすべて破棄する必要があります。パイプラインが再準備されている間、それ以降の実行は遅延されます。
上記の分岐予測の説明:条件付きジャンプの種類ごとに、CPUには2つの命令があり、それぞれに結果への賭けが含まれています。たとえば、ジャンプは最後のものを除くすべての反復で行われる必要があるため、ループの最後に「ゼロでない場合はジャンプ、ゼロでない場合は賭ける」という命令を入れます。これにより、CPUは、ジャンプ命令自体に続く命令ではなく、ジャンプターゲットに続く命令でパイプラインのポンプを開始します。
重要な注意点
ソースコードレベルで最適化する方法の例としてこれを使用しないでください。最初の形式から2番目の形式への変換は、JITコンパイラーがルーチンの問題として完全に独自に行うものであるため、それは完全に見当違いです。