2016-07-22 3 views
1

Est-ce que le compilateur java (tout compilateur grand public) prendre quelque chose commeEst-ce que l'optimisation du compilateur Java est une méthode appelée une fois en supprimant la méthode?

void foo() { 
    int x = 1; 
    System.out.println(x); 
} 

void bar() { 
    foo() 
} 

et optimiser la méthode foo loin si elle est appelée uniquement dans la barre résultant en bytecode qui serait aussi généré par ceci:

void bar() { 
    int x = 1; 
    System.out.println(x); 
} 
+0

Probablement pas puisque les compilateurs Java ne sont pas vraiment optimisés. Ils laissent à la JVM –

+3

Il vaut mieux ne pas. 'foo' est visible en dehors de la classe dans laquelle il est défini. Peut-être que' foo' était privé. – bradimus

+0

similaires à: http://stackoverflow.com/questions/7772864/would-java-inline-methods-during-optimization –

Répondre

1

Non, ce n'est pas le cas. Javac ne fait pas beaucoup d'optimisation au-delà du pliage constant. En Java, l'optimisation se produit au moment de l'exécution avec le JIT.

J'ai créé un court exemple pour montrer comment la méthode n'a pas été incorporée dans le bytecode même si elle n'a été appelée qu'une seule fois. Privé et public ne font aucune différence.

Compiled from "Test.java" 
public class Test { 
    public Test(); 
    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  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #3     // String Hello before method 
     5: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: invokestatic #5     // Method publicMethod:()V 
     11: invokestatic #6     // Method privateMethod:()V 
     14: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     17: ldc   #7     // String Hello after method 
     19: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     22: return 

    public static void publicMethod(); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #8     // String The public method 
     5: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return 

    private static void privateMethod(); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #9     // String The private method 
     5: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return 
}