如下测试代码,一个for (;;)一个while (true),结果编译成class文件后,全部变成while (true),求高手帮助解答,有怀疑的可以亲测。
测试代码:
public class Test { public static void main(String[] args) { Method1(); Method2(); } private static void Method1() { for (;;) { System.out.println("for (;;) 无限循环"); } } private static void Method2() { while (true) { System.out.println("while (true) 无限循环"); } } }
编译class后:
import java.io.PrintStream; public class Test { public static void main(String[] args) { Method1(); Method2(); } private static void Method1() { while (true) System.out.println("for (;;) 无限循环"); } private static void Method2() { while (true) System.out.println("while (true) 无限循环"); } }
然后呢?你在纠结这个问题?
我在纠结,纠结的不行了。我看阿里数据库中间件mycat源码的时候,看到很多地方都是用的for(;;),并且注释里说for(;;)性能较好,后来我自己编译了无意中才发现for和while是一样的,何来for性能高,但是又不相信阿里的工程师是吃素的,只是不明真相哎。
@Jared.Nie: 都是死循环,你纠结个啥?
@顾晓北:
同是死循环,两种写法的性能有差异
for(;;) 编译后00401033 jmp main+23h (00401033) 只有一条指令 ;; 会变成两条空语句和无条件跳转指令jmp,没有额外的寄存器开销,执行效率上略高
而 while (true) 编译后是这样的 00401028 mov eax,10040102D test eax,eax0040102F je main+23h (00401033)00401031 jmp main+18h (00401028),除了mov指令外,还会有无条件跳转指令jmp,等于跳转je,判断指令,test指令,包括这中间变量的寄存器开销
所以在没有编译器优化的情况下,for(;;) 的执行效率以及资源开销都要比while (true) 要好一些,但是目前的编译器大都自带编译优化,当然在不同平台下的编译器优化策略也略有不同,所以为了更好的性能和兼容,推荐for(;;)这种写法。
那请问,你觉得有区别吗?怎能不纠结呢?
期待大家能从更底层更深入的角度以挑剔的眼光回答这个问题,多谢!!
@Jared.Nie: 如果真的有区别的话,写编译器的人都可以去找块豆腐撞死了。
@OpportunityLiu: 有没有区别,不是在这里瞎猜的,去读编译器源码去,拿出证据来,否则与喷子何异?
。。。。。
编译器优化的不错。
Java编译器会对代码进行优化。
当你用了几个反编译出来的结果不一致的时候,才会明白,真的有不同编译器优化不同的事情。
我也有同样的问题,一下是我的想法:
编译器会自动优化代码,当编译器优化后,while和for都是一样的,至于反编译回来的是while是反编译设计的问题,性能应该不存在差异。
一下是引用:
通常讲while和for都有初始化值,都有判断条件和改变变量的语句,所以它们的效率不分高低。只能说在什么时候使用哪种循环好些,当循环的次数已知时最好使用for循环,当循环次数不知时使用while循环。