Java中具有空主体的循环

Java中具有空主体的循环,java,for-loop,Java,For Loop,在修复非常旧的项目中的bug时,我遇到了一种奇怪的方法,它看起来像这样: void waiter() { for (int i = 0; i < 20000; i++) ; } void服务员(){ 对于(int i=0;i

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

   void waiter() {
        for (int i = 0; i < 20000; i++) ;
    }
void服务员(){
对于(int i=0;i<20000;i++);
}

它会导致暂停一段时间,还是会被JVM优化忽略?

它可能会被优化,但可能不会。取决于编译器中的优化级别

变量
i
的作用域是循环,因此它在之后将不可用。编译器能够静态地确定循环将运行已知次数。它还知道空语句重复了这么多次。然后,它可以将多个空语句转换为一个空语句,或者根本不转换任何语句。这会将代码从抽象语法树中完全删除


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

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

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

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


是的,它将被优化。我尝试过:D

通过JIT运行几次后,它将被优化。JVM在第一次运行时,需要检查正在递增的if
i
值是否没有在任何地方使用

请同时查看这篇文章:


你为什么要写这样一篇。。。代码?不是我的,我刚开始做这个项目…:我认为为了暂停程序的执行,他正在使用这种逻辑@JamshidAsatillayev-在这个项目上要非常小心。谁知道你还会发现什么!:)这是错误的,不管是否优化了它。如果你把它放在那里,你是在问什么编译器/设置?你能用一些文档来备份它吗?“优化”是指“删除”吗?编译器省略某些代码似乎很奇怪。@ukaszBachman最佳情况是省略该代码并设置i 20000。甚至不是这样,因为
i
的作用域是循环@ŁukaszBachman这叫做循环展开。请看这里:javac没有做过、没有做过、也永远不会做任何有趣的优化。该链接显示了一个拨号分数测试。不管您设置的计数器值有多大,您都会得到相同的结果:在解释器中运行循环~10k次,JIT将启动并删除循环的其余部分,而不管循环的大小。虽然在这种情况下,这似乎是预期的结果。