Java中有一个空体的循环

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

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

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

它将在JIT几次运行后进行优化。 在第一次运行时,JVM需要检查是否正在增加的值是否在任何地方都没有使用。

检查这篇文章:

Java:空循环使用多长时间?

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

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

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

我不知道它是否已经改变,我没有使用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”替换空循环进行任何优化,这是循环的净效果。

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