![](/img/trans.png)
[英]Why are local variable length for-loops faster? Doesn't branch prediction reduce the effect of lookup times?
[英]Why is branch prediction faster than no branch at all?
灵感来自这个问题: 为什么处理排序数组比处理未排序数组更快?
我写了自己的分支预测实验:
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
为什么会这样?
编辑:
在我的其他机器(英特尔服务器和工作站)上运行相同的实验后,我可能会得出结论,我所经历的这种现象特定于这款笔记本电脑CPU(英特尔i7 Q740M)。
==== 6个月后编辑====
看看这个: http : //eli.thegreenplace.net/2013/12/03/intel-i7-loop-performance-anomaly/
请记住,JVM在内部优化执行,并且PC内部有缓存可以加快计算速度。 由于您拥有如此强大的处理器(许多独立的核心),因此并不奇怪。 另请注意,在Java代码下运行的代码映射到PC的机器代码。 只需输入尽可能优化的代码,让JVM担心它。
编辑:机器和硬件,如大负载,它们运行效率更高。 特别是缓存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.