Java 编译器是否通过删除方法来优化调用一次的方法?
Does the Java compiler optimization a method called once by removing the method?
java 编译器(任何主流编译器)会采用类似
的东西吗?
void foo () {
int x = 1;
System.out.println(x);
}
void bar() {
foo()
}
如果仅在 bar 中调用 foo 方法,则优化 foo 方法,从而导致字节码也由此生成:
void bar() {
int x = 1;
System.out.println(x);
}
不,不是。除了常量折叠之外,Javac 没有做太多优化。在 java 中,优化在运行时使用 JIT 进行。
我创建了一个简短的示例来展示该方法如何没有被内联到字节码中,即使它只被调用了一次。 Private 和 public 没有区别。
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
}
java 编译器(任何主流编译器)会采用类似
的东西吗?void foo () {
int x = 1;
System.out.println(x);
}
void bar() {
foo()
}
如果仅在 bar 中调用 foo 方法,则优化 foo 方法,从而导致字节码也由此生成:
void bar() {
int x = 1;
System.out.println(x);
}
不,不是。除了常量折叠之外,Javac 没有做太多优化。在 java 中,优化在运行时使用 JIT 进行。
我创建了一个简短的示例来展示该方法如何没有被内联到字节码中,即使它只被调用了一次。 Private 和 public 没有区别。
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
}