【问题标题】:Is Java compiler optimizing and do not create new objects/references if not necessaryJava 编译器是否进行了优化,如果没有必要,不要创建新的对象/引用
【发布时间】:2017-10-09 14:26:21
【问题描述】:

Java 编译器是否进行了优化,并且在不需要时不创建新的对象/引用?

例如

public class Foo {

    public void foo(Object[] data) {
        for(int i=0; i<data.length; i++) {
            Object d = data[i];                     // <-- here
            bar(d);
        }
    }

    private void bar(Object o) {
        //...
    }

}

是否与:

public class Foo {

    public void foo(Object[] data) {
        for(int i=0; i<data.length; i++) {
            bar(data[i]);                          // <-- and here
        }
    }

    private void bar(Object o) {
        //...
    }

}

运行时

【问题讨论】:

  • 在两个 sn-ps 中都不涉及对象创建......唯一保存的(是的,可能按原样优化)是局部变量。要查看编​​译器是否实际生成相同的代码,请查看字节码。

标签: java memory-management compiler-optimization


【解决方案1】:

这是一个非常复杂的话题,java编译器优化什么,不优化什么。

当你用javac 编译你的代码时,它基本上不会优化任何东西,除了一些非常小的片段。它保持不变,因此JIT compiler 在运行时拥有更好的知识。因此查看字节码并没有真正的用处。

当您的代码变为hot 时,它被调用的次数足够多并且被 JIT 标记为优化时,就会执行复杂的优化。有人说 JIT 优化的代码可以快 20 倍。根据整个上下文,如果 JIT 决定,您的代码来自这个问题的代码可能会变得完全不同,甚至可以跳过它的执行。 JIT 绝对能够完成您所要求的优化,而且远不止这些。

【讨论】:

  • 换句话说,在编译为字节码的过程中没有任何优化——我说的对吗?
  • 一些事情已经完成:比如内联静态final,计算已知表达式和字符串文字连接,switch语句。此外,在 Java 9 中,旧的字符串连接被替换为 StringConcatFactory 的新用法。这些本身并不是真正的优化,只是一些可以在没有任何缺点的情况下完成的事情。
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 2021-04-03
  • 2018-11-26
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多