8

この質問に触発されました: ソートされていない配列よりもソートされた配列を処理する方が速いのはなぜですか?

私は独自の分岐予測実験を書きました:

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 です。
  • ループの反復回数を大幅に増やすと、分岐のあるループは非分岐のループより数秒速く実行されます。
4

2 に答える 2