【发布时间】:2014-10-22 20:02:32
【问题描述】:
Java 编译器是否应用了一些转换来优化方法调用?还是它总是通过简单的优化(如删除死代码)生成忠实的源代码表示?
如果我们有下面的例子:
public static void main(String[] args) {
System.out.println(foo());
System.out.println(foo());
System.out.println(foo());
System.out.println(bar());
System.out.println(bar());
System.out.println(bar());
}
public static int foo() {
int[] arr = {1, 2, 3, 4};
return arr[0];
}
public static int bar() {
return 10;
}
编译器是否尝试用打印整数10 的调用替换对bar(甚至可能是foo)的调用?
public static void main(String[] args) {
System.out.println(1);
System.out.println(1);
System.out.println(1);
System.out.println(10);
System.out.println(10);
System.out.println(10);
}
我知道一种称为 inlining 的方法可以导致这种转换,但我想知道 Java 编译器(至少是 Oracle JDK 的 javac)是否应用了它,或者它是总是推迟到 JVM。
【问题讨论】:
-
答案是“视情况而定”。 Java 有一个JIT,并且在将源代码转换为字节码时进行了一些优化。所以基本上,只要不改变代码的可观察行为,Java 真的可以随时进行任何类型的优化。
标签: java performance compiler-optimization