0

可能重复:
Java:空循环使用多少时间?

看看以下内容:

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这有什么具体原因吗?当然,毫秒一般来说可能不会有太大的不同,但我只是好奇。

4

3 回答 3

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);
    }
于 2012-10-05T03:18:25.047 回答
1

HotSpot JIT 做了几个优化循环——它首先将代码编译成半优化的机器版本,甚至只是解释它。然后它看到第二个循环实际上是一个热点,并使用更积极的优化重新编译代码。编译过程可能是性能的第二个高峰。然后它执行一个优化版本,它什么都不做,所以你得到全零。如果你用-server它运行代码,可能会更早地编译代码,你会得到不同的结果。运行它-Xint以查看每个循环迭代的均匀性能。

于 2012-10-05T03:24:52.300 回答
1

第二个循环是空的,可以优化掉。由于 JVM 需要一些时间来实现这一事实,所以一开始并没有这样做。也许优化的时间是花在第二次运行上。

于 2012-10-05T03:17:29.140 回答