为什么分支预测比没有分支更快?

受这个问题的启发:为什么处理一个有序数组比未经排序的数组更快?

我写了自己的分支预测实验:

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)
  • 作者为什么使用Java基准技术处理排序数组比未排序数组更快? 和我一样。
  • 该机器是英特尔酷睿i7,运行Linux 3.2 64位和Oracle JVM 1.7 64位
  • 当我超过循环迭代次数时,使用分支循环比非分支循环更快地运行多秒。

  • 请记住,JVM正在内部优化执行,并且您的PC内部存在缓存,可以使计算速度更快。 既然你拥有如此强大的处理器(许多独立内核),这并不奇怪。 另外请注意,在Java代码下运行的代码会映射到您PC的机器代码。 只要输入代码就可以了,让JVM担心。

    编辑:像大负载的机器和硬件,然后他们更有效地运作。 特别是缓存。


    在我的其他机器(英特尔服务器和工作站)上运行相同的实验后,我可能会得出结论,我遇到的现象特定于此笔记本CPU(Intel i7 Q740M)。

    ==== 6个月后编辑====

    看看这个:http://eli.thegreenplace.net/2013/12/03/intel-i7-loop-performance-anomaly/

    链接地址: http://www.djcxy.com/p/281.html

    上一篇: Why is branch prediction faster than no branch at all?

    下一篇: Why is my program slow when looping over exactly 8192 elements?