看看以下内容:
for (int j = 0 ; j < 5 ; j++) {
long t1 = System.currentTimeMillis();
for (int i = 0 ; i < 10000000 ; i++)
; // intentionally empty
long t2 = System.currentTimeMillis();
System.out.println (t2 - t1);
}
输出(许多可能之一):
2
11个
0
0
0
如果您多次运行此程序,您会发现输出的前两个数字始终非零,而所有其他数字确实为0.此外,第二个数字通常为似乎高于第一个。即使我们循环更高,这似乎仍然有效,直到j < 100
为止。 这有什么特别的原因吗?当然,毫秒可能不会产生很大的差异,但我只是好奇。
答案 0 :(得分:1)
第二个循环为空,可以进行优化。由于JVM需要一些时间才能实现这一事实,因此一开始就没有完成。也许优化的时间是第二轮的花费。
答案 1 :(得分:1)
这会产生你追求的结果吗?
long t1 = System.currentTimeMillis();
for (int j = 0 ; j < 5 ; j++) {
for (int i = 0 ; i < 10000000 ; i++){}
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}
答案 2 :(得分:1)
HotSpot JIT做了几个优化循环 - 它首先将代码编译成半优化的机器版本,甚至只是解释它。然后它看到第二个循环实际上是一个热点,并使用更积极的优化重新编译代码。编译过程可能是性能的第二个高峰。然后它执行一个优化的版本,什么都不做,所以你得到全零。如果您使用-server
运行代码,它可能会更早地编译代码,您将获得不同的结果。使用-Xint
运行它以查看每次循环迭代的均匀性能。