3

これらの 2 つのコード スニペットの間に顕著な速度の違いはありますか? 単純に、2 番目のスニペットの方が分岐命令がはるかに少ないため高速になると思いますが、一方で、分岐予測子はこの問題を解決するはずです。それとも、予測可能なパターンにもかかわらず、顕著なオーバーヘッドが発生しますか? 条件付き移動命令は使用しないものとします。

スニペット 1:

for (int i = 0; i < 100; i++) {
    if (a == 3)
        output[i] = 1;
    else
        output[i] = 0;
}

スニペット 2:

if (a == 3) {
    for (int i = 0; i < 100; i++)
        output[i] = 1;
} else {
    for (int i = 0; i < 100; i++)
        output[i] = 0;
}

これらのケースを自分で最適化するつもりはありませんが、予測可能なパターンであっても分岐のオーバーヘッドについてもっと知りたいです。

4

2 に答える 2

3

ループに入ると変更されないため、2 つのコード スニペットに大きな違いはないはずですa

個人的には、ループ内で変更されていないことを考えると、分岐予測子が実際にはありそうにない分岐の予測に失敗しない限り、前者を好みます。a

さらに、コンパイラはこの最適化を実行する場合があります。

これにより、両方のコード スニペットがまったく同じマシン命令を発行するようになります。

于 2012-09-03T16:17:35.190 に答える
1

ハードウェアを指定せずにパフォーマンスに関する質問をしました (ただし、質問から、分岐予測を備えたアーキテクチャの 1 つだと推測できます)、ツールチェーン、またはコンパイル オプション。

全体として、これはスペースと速度の別のトレードオフにすぎず、スペース自体が速度に影響することがよくあります (CPU 命令とマイクロコード キャッシュ)。

唯一の合理的な答えは、「パフォーマンスはプロセッサ ハードウェアとコンパイラの最適化によって異なります」です。

于 2012-09-03T16:28:54.070 に答える