首页 新闻 会员 周边

Java for(;;)编译后变成while(true)

0
悬赏园豆:20 [待解决问题]

如下测试代码,一个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) 无限循环");
  }
}

 

 

Jared.Nie的主页 Jared.Nie | 小虾三级 | 园豆:1940
提问于:2016-10-13 15:39
< >
分享
所有回答(6)
0

然后呢?你在纠结这个问题?

顾晓北 | 园豆:10844 (专家六级) | 2016-10-13 15:45

我在纠结,纠结的不行了。我看阿里数据库中间件mycat源码的时候,看到很多地方都是用的for(;;),并且注释里说for(;;)性能较好,后来我自己编译了无意中才发现for和while是一样的,何来for性能高,但是又不相信阿里的工程师是吃素的,只是不明真相哎。

支持(0) 反对(0) Jared.Nie | 园豆:1940 (小虾三级) | 2016-10-17 16:13

@Jared.Nie: 都是死循环,你纠结个啥?

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2016-10-17 16:18

@顾晓北: 

 

同是死循环,两种写法的性能有差异

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(;;)这种写法。

 

那请问,你觉得有区别吗?怎能不纠结呢?

 

期待大家能从更底层更深入的角度以挑剔的眼光回答这个问题,多谢!!

支持(0) 反对(0) Jared.Nie | 园豆:1940 (小虾三级) | 2016-10-18 09:27

@Jared.Nie: 如果真的有区别的话,写编译器的人都可以去找块豆腐撞死了。

支持(0) 反对(0) OpportunityLiu | 园豆:255 (菜鸟二级) | 2016-10-18 17:29

@OpportunityLiu: 有没有区别,不是在这里瞎猜的,去读编译器源码去,拿出证据来,否则与喷子何异?

支持(0) 反对(0) Jared.Nie | 园豆:1940 (小虾三级) | 2016-10-19 09:11
0

。。。。。

代码飞了 | 园豆:470 (菜鸟二级) | 2016-10-13 17:16
1

编译器优化的不错。

Daniel Cai | 园豆:10424 (专家六级) | 2016-10-13 18:41
0

Java编译器会对代码进行优化。

一剑侵心 | 园豆:281 (菜鸟二级) | 2016-10-17 10:51
0

当你用了几个反编译出来的结果不一致的时候,才会明白,真的有不同编译器优化不同的事情。

jasondyoung | 园豆:424 (菜鸟二级) | 2016-10-17 12:45
0

我也有同样的问题,一下是我的想法:
编译器会自动优化代码,当编译器优化后,while和for都是一样的,至于反编译回来的是while是反编译设计的问题,性能应该不存在差异。
一下是引用:
通常讲while和for都有初始化值,都有判断条件和改变变量的语句,所以它们的效率不分高低。只能说在什么时候使用哪种循环好些,当循环的次数已知时最好使用for循环,当循环次数不知时使用while循环。

一天521 | 园豆:202 (菜鸟二级) | 2020-08-03 10:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册