在非常古老的项目中修复bug我遇到了奇怪的方法,它看起来像这样:
void waiter() {
for (int i = 0; i < 20000; i++) ;
}
是否会导致暂停一段时间,或者JVM优化会忽略它?
答案 0 :(得分:5)
经过JIT的少量运行后,它将得到优化。在第一次运行时,JVM需要检查正在递增的i
值是否未在任何地方使用。
检查这篇文章:
答案 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