java运行期优化final,关于java:final启用哪种优化?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

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有什么好处? 方法级变量的问题相同。

这完全是特定于实现的。

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

+1:final字段也保证在构造函数返回时在线程中可见。 如您所说,请考虑正确性而不是性能。 大多数JVM足够聪明,可以在不更改字段的情况下进行工作。

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

报价:最终词在最终关键字上,使用final获得的性能提升为:

A field doesn't need to be ever reloaded, since its value is

guaranteed never to change.

但是我在上面的语句中看到一个缺陷,如果只设置一次该值就不会重新加载,而final保证永远不会再次加载该值,但这并不意味着直接使用final可以帮助您提高性能,提高性能我们到达此处的原因是该属性,如果我们确保不将设置为其他值,则无论如何都不会重新加载该属性。

因此,您回答:

尽管它是特定于JVM的实现,但至少是HotSpot中的实现,但是使用final不会带来任何性能提升。阅读更多:在Java中使用final关键字是否可以提高性能?

IBM还说,您最终不会获得蚂蚁性能的提升。

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

有关JVM优化的信息,请参见此处的其他答案。

我怀疑最终字段是否会对性能产生巨大影响,除非您在多个线程中共享了对象。

但是,将方法声明为final或甚至是类将有助于jit确定是否可以重写某个方法。如果确定该jit,则该方法不会被覆盖,他可能会删除方法查找并使用直接跳转(跳转子例程)。 Jits也喜欢内联小的最终方法。

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

那不是我要问的。 我知道我可以利用确定性。 但是JVM可以吗?

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

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

我记得一个很好的例子,在我的程序中以及自从我使用final变量以来,我在条件中都有if-else条件,complier评估了if-else的哪一部分有效,并且它去除了其他行,并且我已经用javap看到了。我很快会给你那个例子。

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

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

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

对于局部变量,最后仅在编译时出现,因此它不能提供任何运行时优化。 stackoverflow.com/questions/266806/

你是认真的吗?? 您将我的答案标记为"在运行时都没有用"吗?? 我剩下的答案又如何呢? 对于拥有IT较长时间的他来说,这是什么竞争? 仅凭评论就可以纠正我的错误吗? 耶稣...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值