【Java基础篇】While(true) 和 for(;;)哪个性能更好呢-LMLPHP

两个无限循环的性能分析


✔️两者反编译比较


While(true) 和 for(; 😉 都是做无限循环的代码,他们两个有什么区别呢?


关于这个问题,网上有很多的讨论,今天我收到私信,所以凑着假期,统一回复一下这个问题。


说多了无用,直接反编译吧,看看字节码有什么区别我们就明白了。


首先我们来准备两段代码:


/**
 *    编程实现两种方式无限循环性能比较
 */

public class WhileAndFor {

    public static void main(String[] args) {
    
        //Code.1 While的无限循环

        while (true) {
		
		    System.out.println("this is a WhileDemo......");
	    }
    	
    }
}

/**
 *    编程实现两种方式无限循环性能比较
 */

public class WhileAndFor {

    public static void main(String[] args) {
    
        //Code.1 For的无限循环

        for(; ; ) {
      
	    System.out.println("this is a ForDemo......");
        }
    
    }
}

我们首先在控制台将这两段代码编译成 .class 文件



然后我们再通过javap .class 文件进行反编译,然后我们就会发现,两个文件的内容,简直是一模一样。


PS F:\Java> javac -encoding utf-8 WhileAndFor.java
PS F:\Java> javap -c WhileAndFor.class
Compiled from "WhileAndFor.java"
public class WhileAndFor {
  public WhileAndFor();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #13                 // String this is a Fordemo......
       5: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: goto          0
}
PS F:\Java> javac -encoding utf-8 WhileAndFor.java
PS F:\Java> javap -c WhileAndFor.class
Compiled from "WhileAndFor.java"
public class WhileAndFor {
  public WhileAndFor();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #13                 // String this is a WhileDemo......
       5: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: goto          0
}
PS F:\Java>


有人愿意用while(true) ,因为可以更清晰的来出来这是个无限循环,有人愿意用 for(;;),因为有些 IDE 对于While(true)会给出警告。当然我们也可以抑制警告是吧,用@SuppressWarnings(“all”),当然抑制警告的属性不是只有all一种是吧,比如抑制资源警告我们用@SuppressWarnings(“resource”)有兴趣大家可以自行去查阅。


祝大家元旦快乐!阖家幸福!家庭幸福美满!事业腾飞冲天!

01-02 08:25