编译器优化方法调用

时间:2014-10-22 20:02:33

标签: java performance compiler-optimization

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;
}

编译器是否尝试通过调用打印整数bar来替换对foo(甚至可能10)的调用?

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);
}

我知道一种名为内联的方法可以导致这种转换,但我想知道Java编译器(至少是Oracle JDK的javac)是否适用它,或者如果它总是推迟到JVM。

1 个答案:

答案 0 :(得分:1)

此类优化称为constant folding

Java规范允许这些(和其他优化)不影响程序的可观察结果。

但是,给定编译器是否实际执行这些优化完全取决于实现。