日期:2014-05-20  浏览次数:20765 次

关于for循环执行时间的问题
long start = System.currentTimeMillis();
for(int i = 0; i < 10000; i ++) {
for(int j = 0; j < 10000; j++) {
for(int k = 0; k < 10; k ++) {

}
}
}
long end = System.currentTimeMillis();
long time = end - start;
System.out.println(time);


上段代码,如果我把第三层for循环注释掉,执行时间只需62毫秒,而加上第三层就为1703毫秒。第3层for循环事实上K只到10呀~~~为什么执行时间会有这么大的差距?


------解决方案--------------------
Hotspot JVM 是JIT 实现.
JVM 有一个后台编译器,会对反复运行的java字节码进行编译,编译成本地机器指令。
在编译的过程中,JVM会对编译结果进行激进的优化,
某些被识别出来的空循环很可能就被跳过去了,也就是说在执行的机器指令里根本就没有你的空循环了。
你的空循环,很可能在某个时刻被JVM的后台编译器整个优化掉了。

另外现代CPU 在处理指令流的时候有流水线和分支预判机制,也会造成巨大的执行时间差异。

总之, 没事别测空循环,那个时间没意义。