Java优化:( Hotspot/Dalvik)优化最终方法返回常量?

Mar*_*ouf 6 java android jit jvm-hotspot dalvik

任何人都可以告诉我,Hotspot或Dalvik是否足够聪明,可以内联调用返回常量(静态最终)int值的final方法?理想情况下,方法调用将被常量替换.这可能是在类加载时或通过JIT.

这对我正在研究的一些代码的设计有影响.

min*_*das 12

我认为答案是"不,优化不会因为final关键字缺席或存在而发生",至少在HotSpot VM上是这样.但由于其他因素,可能会发生优化.

以下是Brian Goetz在本文中所说的内容(对于长篇引用感到抱歉):

像许多关于Java性能的神话一样,错误地认为将类或方法声明为最终导致更好的性能的错误信念被广泛持有但很少被检查.该论点认为将方法或类声明为final意味着编译器可以更积极地内联方法调用,因为它知道在运行时这肯定是将要调用的方法的版本.但事实并非如此.仅仅因为类X针对最终类Y进行编译并不意味着将在运行时加载相同版本的类Y. 因此编译器无法安全地,最终或不是内联这样的跨类方法调用.只有当方法是私有的时,编译器才能自由地内联它,在这种情况下,final关键字将是多余的.

另一方面,运行时环境和JIT编译器有关于实际加载哪些类的更多信息,并且可以比编译器做出更好的优化决策.如果运行时环境知道没有加载扩展Y的类,则它可以安全地内联对Y方法的调用,无论Y是否为final(只要它可以使这样的JIT编译的代码无效,如果是Y的子类)稍后加载).所以现实情况是,虽然final可能对一个不执行任何全局依赖性分析的哑运行时优化器有用,但它的使用实际上并不能实现很多编译时优化,并且智能不需要JIT执行运行时优化.

还有一个很好的帖子,为什么决赛不再是决赛,至少在Java 5中如此.