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

为什么会这样?

编辑:

4

2 回答 2

3

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

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

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

于 2013-06-02T09:56:29.397 回答
2

请记住,JVM 正在内部优化执行,并且您的 PC 内部有缓存可以加快计算速度。由于您拥有如此强大的处理器(许多独立的内核),这并不奇怪。另请注意,在 Java 代码下运行的代码映射到您 PC 的机器代码。只需键入尽可能优化的代码,让 JVM 操心。

编辑:机器和硬件喜欢大负载,然后它们以更高的效率运行。尤其是缓存。

于 2013-06-02T10:03:15.097 回答