2013-07-21 54 views
-1

我可以通過兩種類型的代碼片段來做同樣的事情。哪個代碼片段執行速度更快?

第一種方式:

String makeDate = Integer.toString(now.year) + Integer.toString(now.month) + Integer.toString(now.monthDay); 

或者第二種方式:

String makeDate = now.year + "" + now.month + "" + now.monthDay; 

我的問題是:

  1. 哪種方法最好[第一種方式還是第二種方法]
  2. 哪個代碼片段執行速度會更快?
+3

使用任何您發現最具可讀性的東西。您需要執行這十億次和數十億次才能發現差異。 –

+0

他們都會在恆定的時間執行,因此執行時間肯定不會成爲問題.....說了第二種方式在我看來更優雅,沒有必要包裝任何東西。 – HCL02

回答

5

您顯示的兩個小竅門幾乎完全相同。

a String in Java is immutable;它不能改變。當使用連接符(+)編譯器使用StringBuilder

例如你的第二個SNIPPIT變成實際生成代碼:

String makeDate = new StringBuilder() 
        .append(now.year) 
        .append("") 
        .append(now.month) 
        .append("") 
        .append(now.monthDay) 
        .toString(); 

你可以看一下生成的字節碼看到這一點。 Java附帶一個程序javap,它允許您查看編譯的.class

我創建了一個簡單main()提供最小的字節碼:

public static void main(String[] args) 
{ 
    String makeDate = Integer.toString(1) + Integer.toString(1) + Integer.toString(1); 
    System.out.println(makeDate); 
} 

主要生產:

public static void main(java.lang.String[]); 
    flags: ACC_PUBLIC, ACC_STATIC 
    Code: 
     stack=2, locals=2, args_size=1 
     0: new   #2     // class java/lang/StringBuilder 
     3: dup   
     4: invokespecial #3     // Method java/lang/StringBuilder."<init>":()V 
     7: iconst_1  
     8: invokestatic #4     // Method java/lang/Integer.toString:(I)Ljava/lang/String; 
     11: invokevirtual #5     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     14: iconst_1  
     15: invokestatic #4     // Method java/lang/Integer.toString:(I)Ljava/lang/String; 
     18: invokevirtual #5     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     21: iconst_1  
     22: invokestatic #4     // Method java/lang/Integer.toString:(I)Ljava/lang/String; 
     25: invokevirtual #5     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     28: invokevirtual #6     // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
     31: astore_1  
     32: getstatic  #7     // Field java/lang/System.out:Ljava/io/PrintStream; 
     35: aload_1  
     36: invokevirtual #8     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     39: return  

對戰:

public static void main(String[] args) 
{ 
    int i = 1; 
    String makeDate = i + "" + i + "" + i; 
    System.out.println(makeDate); 
} 

產地:

public static void main(java.lang.String[]); 
    flags: ACC_PUBLIC, ACC_STATIC 
    Code: 
     stack=2, locals=3, args_size=1 
     0: iconst_1  
     1: istore_1  
     2: new   #2     // class java/lang/StringBuilder 
     5: dup   
     6: invokespecial #3     // Method java/lang/StringBuilder."<init>":()V 
     9: iload_1  
     10: invokevirtual #4     // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
     13: ldc   #5     // String 
     15: invokevirtual #6     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     18: iload_1  
     19: invokevirtual #4     // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
     22: ldc   #5     // String 
     24: invokevirtual #6     // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
     27: iload_1  
     28: invokevirtual #4     // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
     31: invokevirtual #7     // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
     34: astore_2  
     35: getstatic  #8     // Field java/lang/System.out:Ljava/io/PrintStream; 
     38: aload_2  
     39: invokevirtual #9     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     42: return   

技術上後者可能在某種程度上更快,幾乎不可測量(< 1ns),但對於所有實際目的而言並不重要;使用你喜歡的任何一個。

相關問題