【问题标题】:Compiler optimization of method calls方法调用的编译器优化
【发布时间】: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 performance compiler-optimization


【解决方案1】:

这种优化称为constant folding

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

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

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2017-05-29
    相关资源
    最近更新 更多