Java中有一个空体的循环

时间:2012-01-11 09:57:12

标签: java for-loop

在非常古老的项目中修复bug我遇到了奇怪的方法,它看起来像这样:

   void waiter() {
        for (int i = 0; i < 20000; i++) ;
    }

是否会导致暂停一段时间,或者JVM优化会忽略它?

4 个答案:

答案 0 :(得分:5)

经过JIT的少量运行后,它将得到优化。在第一次运行时,JVM需要检查正在递增的i值是否未在任何地方使用。

检查这篇文章:

Java: how much time does an empty loop use?

答案 1 :(得分:2)

它可能是优化的,也可能不是。取决于编译器中的优化级别。

变量i的范围限定为循环,因此在之后它将不可用。编译器能够静态地识别循环将运行已知次数。它也知道空语句会重复多次。然后它可以将一些空语句转换为一个空语句,或者根本不转换任何语句。这具有从抽象语法树中完全删除代码的效果。

这将在某些优化设置和编译器下发生,而不会在其他设置和编译器下发生。

答案 2 :(得分:1)

我不知道它是否已经改变,我没有使用java 2年,但它似乎没有。

http://www.herongyang.com/JVM/Benchmark-Int-Empty-Loop-16-Nanosecond.html http://www.herongyang.com/JVM/Benchmark-Long-Empty-Loop-25-Nanosecond.html

  

此测试还确认Java字节码编译器“javac”不是   用“i = steps”替换空循环进行任何优化   这是循环的净效应。

答案 3 :(得分:0)

是的,它会得到优化。我试过了:D