2016-07-22 26 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 
} 
相关问题