この質問に触発されました: ソートされていない配列よりもソートされた配列を処理する方が速いのはなぜですか?
私は独自の分岐予測実験を書きました:
public class BranchPrediction {
public static void main(final String[] args) {
long start;
long sum = 0;
/* No branch */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
/* With branch */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
if (i >= 0)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
/* No branch (again) */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
/* With branch (again) */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
if (i >= 0)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
}
}
結果は私を混乱させます.プログラム出力によると、分岐のあるループは、分岐のないループよりも確実に高速です。
出力例:
7949691477
-5340232226128654848
6947699555
-5340232226128654848
7920972795
-5340232226128654848
7055459799
-5340232226128654848
なぜそうなのですか?
編集:
- 逆アセンブルされたクラスは、Java コンパイラが何も最適化 (ミス) しなかったことを示しています ( https://gist.github.com/HouzuoGuo/5692424 )
- Why is it fast to process a sorted array than an unsorted array? の著者が使用した Java ベンチマーク手法 私と同じです。
- マシンは、Linux 3.2 64 ビットおよび Oracle JVM 1.7 64 ビットを実行する Intel Core i7 です。
- ループの反復回数を大幅に増やすと、分岐のあるループは非分岐のループより数秒速く実行されます。