Java中的持续时间差异

时间:2012-10-05 03:10:05

标签: java time

  

可能重复:
  Java: how much time does an empty loop use?

看看以下内容:

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为止。 这有什么特别的原因吗?当然,毫秒可能不会产生很大的差异,但我只是好奇。

3 个答案:

答案 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运行它以查看每次循环迭代的均匀性能。