【发布时间】:2013-09-27 10:07:15
【问题描述】:
我有一个 HashMap 密集型 Java 程序,其中几个类的哈希码从 final 字段计算而来。例如:
public class Foo {
private final int bar;
private final String zot;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + bar;
result = prime * result + zot.hashCode();
return result;
}
}
编译器可能会观察到哈希码在对象初始化后无法更改,并将其预先计算到额外的private final 字段中。当前的 Java 编译器是否执行此操作,例如 Oracle JDK 7 中的编译器?我可以分解.class 文件,但是JIT 也可能在运行时进行这种优化,我不会在那里看到它。无论如何,我对除此之外的其他情况感兴趣,因此如果能找到一种通用方法来识别编译器自动执行的任何优化,那就太好了。
【问题讨论】:
-
如果对象从未真正用于
HashMap或其他任何调用其hashCode方法的对象,那么您所描述的是反优化。 -
编译器无法做到这一点,但有一个ongoing discussion 将它引入Lombok
-
@LouisWasserman:JIT 分析应用程序的热门方法并开始移动它们是很常见的。例如,任何专门访问静态和私有字段的方法都可以内联到任何频繁调用者中。这是一个昂贵的优化,所以它只发生在被观察为热的方法上。但是我想知道的是,我们怎样才能知道 JIT 做了哪些优化呢?如果有一个文档,或者以某种方式对其进行内省,那就太好了。
标签: java optimization compiler-construction