2016-07-22 5 views
1

は、Javaコンパイラ(任意の主流のコンパイラは)メソッドを削除してJavaコンパイラの最適化メソッドを一度呼び出すのですか?

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

void bar() { 
    foo() 
} 

ようなものを取ると、それが唯一のも、このことにより、生成されるバイトコードが得られバーで呼び出された場合離れfooメソッドを最適化します:

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

ほとんどの場合、Javaコンパイラは実際に最適化していないためです。彼らはそれをJVM –

+3

に任せています。 'foo'は、それが定義されているクラスの外側に見えます。おそらく' foo'がプライベートであったとします。 – bradimus

+0

類似している:http://stackoverflow.com/questions/7772864/would-java-inline-methods-during-optimization –

答えて

1

いいえ、そうではありません。 Javacは絶え間なく折りたたみを超えて多くの最適化を行いません。 Javaでは、最適化はJITで実行時に行われます。

バイトコードでメソッドがインライン化されなかった方法を示す簡単な例を作成しましたが、これは一度しか呼び出されませんでした。プライベートとパブリックは違いはありません。

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 
} 
関連する問題