gpt4 book ai didi

java - java final 是否有助于编译器创建更高效​​的字节码?

转载 作者:IT老高 更新时间:2023-10-28 20:45:15 24 4
gpt4 key购买 nike

Possible Duplicate:
Does use of final keyword in Java improve the performance?

final 修饰符有 different consequences在java中取决于你应用它。我想知道的是,如果 另外 它可能会帮助编译器创建更高效​​的字节码。我想这个问题深入到 JVM 是如何工作的,并且可能是 JVM 特定的。

那么,根据您的专业知识,以下任何一项对编译器有帮助吗,还是仅出于正常的 java 原因使用它们?

  • 期末课
  • final方法
  • 最终字段
  • final方法参数

谢谢!

编辑:感谢您的所有回答!请注意,正如@Zohaib 建议的那样,我的问题与this 重复。 .发帖前我搜索的不够好。我不会删除它,因为你们做出了很好的贡献,但答案可以合并。除非另有说明,否则我将让“投票赞成”系统决定。

最佳答案

如果您使用 final,字节码的效率并不会显着提高或降低,因为 Java 字节码编译器通常很少做优化。效率奖励(如果有)将在 JIT 编译器生成的 native 代码中1

理论上,使用 final 可为 JIT 编译器提供一个提示,帮助其优化。在实践中,最近的 HotSpot JIT 编译器可以通过忽略您的提示来做得更好。例如,现代 JIT 编译器通常会执行全局分析,以确定给定的方法调用是否是对应用程序当前加载的类的上下文中的叶方法的调用。此分析比您的 final 提示更准确,运行时甚至可以检测何时加载了使分析无效的新类......并为受影响的代码重做分析和 native 代码生成.

使用final还有其他语义后果:

  • 将变量声明为 final 可防止您意外更改它。 (并向读者表达您的意图。)
  • 将方法声明为 final 可防止在子类中被覆盖。
  • 将一个类声明为 final 完全防止子类化。
  • 将字段声明为 final 会阻止子类对其进行更改。
  • 将字段声明为 final 对线程安全有重要影响;见 JLS 17.5 .

在适当的情况下,这些都是好的。但是,很明显,它们通过创建子类限制了您对重用的选择。在决定是否使用final时需要考虑这一点。

所以好的做法是使用 final 来(广义上)表达您的设计意图,并实现您需要的其他语义效果。如果您将 final 仅仅用作优化提示,您将不会有太多收获。


有几个异常(exception)情况,final 可能会在某些平台上导致小的性能提升。

  • 在某些情况下,将字段声明为 final 会改变字节码编译器处理它的方式。我在上面给出了一个例子。另一种是“常量变量”情况 (JLS 4.12.4),其中 static final 字段的值 将由字节码编译器在当前类和其他类中内联,这可能会影响观察到的代码行为。 (例如,引用常量变量不会触发类初始化。因此,添加 final 可能会改变类初始化的顺序。)

  • 可以想象,将字段或局部参数声明为 final 可能会允许较小的 JIT 编译器优化,否则不会进行。但是,任何可以声明为 final 的字段也可以被 JIT 编译器推断为有效的 final。 (只是不清楚 JIT 编译器是否真的这样做,以及这是否会影响生成的 native 代码。)

但底线保持不变。您应该使用 final 来表达您的设计意图,而不是作为优化提示。


1 - 这个答案假设我们正在谈论一个具有良好 JIT 或 AOT 编译器的最新 JVM。 1) 最早的 Sun Java 实现根本没有 JIT 编译器。 2) 早期的 Android Java 实现的编译器在优化方面做得很差。事实上,早期的 Android 开发人员文档建议使用各种源级微优化来进行补偿。此建议已被删除。

关于java - java final 是否有助于编译器创建更高效​​的字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8354412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com