“final”启用什么样的优化?

时间:2011-09-16 15:30:26

标签: java

  

可能重复:
  Is there any performance reason to declare method parameters final in Java?
  Does use of final keyword in Java improve the performance?

所以有一个类级别的对象变量,它是在创建对象时分配的,并且在对象的生命周期内保持不变:

class MyClass
{
    private Rect rc = new Rect();
    //...
}

我获得了什么声明final?方法级变量的问题相同。

7 个答案:

答案 0 :(得分:3)

它完全是针对具体实现的。

使用final的主要原因是确保不允许变量值随时间变化。这是代码逻辑而不是优化的问题。

答案 1 :(得分:1)

最终声明变量确实具有来自不变性的好处。如果使用得当,你的代码可以更加线程安全,前提是你正在制作的变量没有内部状态,可以意外地改变并影响其他线程。

在这里也可以看到有关JVM优化的其他答案。

答案 2 :(得分:1)

Final有一个显而易见的用途,它使对象/变量不可变,现在这个功能有助于提高性能吗?

引用:The Final Word On the final Keyword,您使用final获得的性能提升是:

  

不需要重新加载字段,因为它的值是   保证永远不会改变。

但是我在上面的语句中看到了一个缺陷,如果它只设置一次并且最终保证它永远不会再次重新加载,则不会重新加载该值,但这并不意味着使用final会直接帮助您提高性能,我们在这里获得的性能提升是由于如果我们确保不设置其他东西,那么无论如何都不会重新加载。

所以,你回答: 虽然它是特定于JVM的实现,并且至少在HotSpot中,但是使用final不会带来任何性能提升。阅读更多:Does use of final keyword in Java improve the performance?

IBM也says你将无法获得最终的蚂蚁表现。

答案 3 :(得分:0)

这可能不会给你100%的回答。但我有一点我知道。

当你将变量声明为final时,jvm会获得很多优化。

我记得一个很好的例子,我在我的程序中有if-else条件,因为我使用了final变量,complier已经评估了if-else的哪一部分是有效的,它剥离了其他行,我已经看到了它与javap。我很快就会告诉你那个例子。

答案 4 :(得分:0)

它允许通过memoization进行一些优化。例如,如果你有一个具有最终高度和最终宽度的Rectangle类,那么你的矩形区域函数只需要计算一次,因为它知道高度和宽度不能改变。

答案 5 :(得分:0)

我怀疑最终字段会对性能产生影响,除非您在多个线程中共享对象。 然而,声明方法final或even类将有助于jit确定方法可以被覆盖,或者不能。如果jit确定方法是否覆盖,则可能会删除方法查找并使用直接跳转(跳转子例程)。 Jits也喜欢内联小的最终方法。

答案 6 :(得分:-1)

除了对修改(*)的明显编译时保护之外,您还可以获得对其值的某种形式的优化访问。例如,编译器可以用文字值替换原始变量的引用。运行时可以例如将其内容的副本放在每个线程的私有内存空间中,以避免访问主内存。它确实依赖于每个JVM实现。

对于局部变量,您在编译时和运行时都会再次获得收益,主要是以线程访问优化的形式。但请记住,您只会在代码的热点中注意到这些增益,代码每秒执行数百或数千次。

(*)final仅在引入可访问对象后才能防止编译时修改。