Java “final”支持什么样的优化?

Java “final”支持什么样的优化?,java,Java,可能重复: 因此,有一个类级对象变量,在对象创建时分配,并在对象的生命周期内保持不变: class MyClass { private Rect rc = new Rect(); //... } 宣布它为最终结果有什么好处?方法级变量也有同样的问题。这些都是完全特定于实现的 使用final的主要原因是为了确保变量值不允许随时间变化。这是您的代码逻辑问题,而不是优化问题。这完全是特定于实现的 使用final的主要原因是为了确保变量值不允许随时间变化。这是你的代码逻辑问题,而不是

可能重复:

因此,有一个类级对象变量,在对象创建时分配,并在对象的生命周期内保持不变:

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

宣布它为最终结果有什么好处?方法级变量也有同样的问题。

这些都是完全特定于实现的


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

这完全是特定于实现的


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

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

当您将变量声明为final时,jvm获得了很多优化


我记得一个很好的例子,在我的程序中有if-else条件,在我使用final变量后的条件中,complier计算了if-else的哪一部分是有效的,它去掉了其他行,我用javap看到了它。我很快就会给你这个例子。

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

当您将变量声明为final时,jvm获得了很多优化


我记得一个很好的例子,在我的程序中有if-else条件,在我使用final变量后的条件中,complier计算了if-else的哪一部分是有效的,它去掉了其他行,我用javap看到了它。我很快就会给你这个例子。

它允许通过记忆进行一些优化。例如,如果您有一个具有最终高度和最终宽度的矩形类,那么您的矩形的面积函数只需要计算一次,因为它知道高度和宽度不能更改。

它允许通过记忆进行一些优化。例如,如果您有一个具有最终高度和最终宽度的矩形类,那么您的矩形的面积函数只需要计算一次,因为它知道高度和宽度不能更改。

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


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

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


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

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

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


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

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

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


*final只在引入可访问对象后防止编译时修改。

final有一个明显的用途,它使对象/变量不可变,现在这个功能可以帮助提高性能吗

引用:,使用final获得的性能增益为:

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

但是我在上面的语句中看到了一个缺陷,如果只设置一次,则不会重新加载该值,并且final保证不会再次重新加载该值,但这并不意味着直接使用final可以帮助您获得性能增益,我们在这里获得的性能增益是由于这样一个属性,即如果我们确保不将 否则,它将无论如何不会被重新加载

所以,你回答: 尽管它是特定于JVM的实现,并且至少在热点中是这样,但是使用final不会获得任何性能提升。阅读更多:


IBM也不会从final中获得ant性能增益。

final有一个明显的用途,它使对象/变量不可变,现在这个功能可以帮助提高性能吗

引用:,使用final获得的性能增益为:

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

但是我看到上面的语句中有一个缺陷,如果只设置一次,则不会重新加载该值,并且final保证不会再次重新加载该值,但这并不意味着直接使用final可以帮助您获得性能增益,我们在这里获得的性能增益是由于这样一个属性,即如果我们确保不将该值设置为其他值,无论如何,它不会被重新加载

所以,你回答: 尽管它是特定于JVM的实现,并且至少在热点中是这样,但是使用final不会获得任何性能提升。阅读更多:


IBM也不会从final中获得ant性能增益。

我怀疑final字段对性能有很大影响,除非您在多个线程中共享了对象。
然而,声明方法final或甚至类将有助于jit确定方法是否可以被重写。如果jit确定方法没有被覆盖,他可能会删除方法查找并使用直接跳转子例程。JIT也喜欢内联小的final方法。

我怀疑final字段对性能有什么影响,除非您在多个线程中共享了对象。
然而,声明方法final或甚至类将有助于jit确定方法是否可以被重写。如果jit确定方法没有被覆盖,他可能会删除方法查找并使用直接跳转子例程。JIT也喜欢内联小的final方法。

+1:当构造函数返回时,final字段也保证在整个线程中可见。正如你所说,考虑正确性而不是性能。大多数JVM都足够聪明,可以在字段没有更改时计算出来。+1:当构造函数返回时,最终字段也保证在整个线程中可见。正如你所说,考虑正确性而不是性能。大多数JVM都足够聪明,能够计算出字段什么时候没有更改。这不是我要问的。我明白我可以利用最终性;但是JVM可以吗?这不是我要问的。我明白我可以利用最终性;但是JVM可以吗?对于局部变量,finally只在编译时出现,所以它不能提供任何运行时优化。你是认真的吗??您在运行时将我的答案标记为对两者都不有用??我剩下的答案是什么,这没有帮助吗??这是一场什么样的比赛,对那些时间更长的人来说??单凭评论就足以纠正我的错误吗?Jesus…对于局部变量,finally仅在编译时出现,因此它不能提供任何运行时优化。你是认真的吗??您在运行时将我的答案标记为对两者都不有用??我剩下的答案是什么,这没有帮助吗??这是一场什么样的比赛,对那些时间更长的人来说??单凭评论就足以纠正我的错误吗?上帝啊