2016-07-22 18 views
1

Würde der Java-Compiler (jeder Mainstream-Compiler) nehmen so etwas wieOptimiert der Java-Compiler eine einmal aufgerufene Methode, indem er die Methode entfernt?

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

void bar() { 
    foo() 
} 

und die Foo-Methode entfernt optimieren, wenn es nur in bar, was zu Bytecode, der auch durch diese erzeugt werden würde genannt wird:

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

Wahrscheinlich nicht, da Java-Compiler nicht wirklich optimieren. Sie überlassen das der JVM –

+3

. Es war besser nicht. 'foo' ist außerhalb der Klasse sichtbar, in der es definiert ist. Vielleicht, wenn' foo' privat ist. – bradimus

+0

ähnlich wie: http://stackoverflow.com/questions/7772864/would-java-inline-methods-during-optimization –

Antwort

1

Nein, tut es nicht. Javac macht nicht viel Optimierung jenseits konstanter Faltung. In Java erfolgt die Optimierung zur Laufzeit mit dem JIT.

Ich habe ein kurzes Beispiel erstellt, um zu zeigen, wie die Methode im Bytecode nicht inline wurde, obwohl sie nur einmal aufgerufen wurde. Privat und öffentlich machen keinen Unterschied.

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 
}