受到这个问题的启发:为什么处理已排序的数组比未排序的数组更快?
我自己写了一个分支预测实验:
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基准测试技术与我的相同。
- 该机器是运行Linux 3.2 64位和Oracle JVM 1.7 64位的Intel Core i7。
- 当我增加循环迭代次数时,带分支的循环比非分支循环运行速度快数秒。
sum
变量。目前情况下,JIT 可以合法地将所有内容优化掉。 - Mysticial