java Finals 是否有助于编译器创建更高效​​的字节码? [复制]

2023-12-21

可能的重复:
Java中使用final关键字会提高性能吗? https://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance

The final修饰符有不同的后果 http://en.wikipedia.org/wiki/Final_%28Java%29在java中取决于你应用它的目的。我想知道的是如果此外它可能有助于编译器创建更高效​​的字节码。我想这个问题深入到 JVM 如何工作,并且可能是 JVM 特定的。

那么,根据您的专业知识,以下任何内容是否对编译器有帮助,或者您仅出于正常的 java 原因才使用它们?

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

Thanks!

编辑:感谢您的所有回答!请注意,正如 @Zohaib 所建议的,我的问题是重复的this https://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance。发帖前我搜索得不够仔细。我不会删除它,因为你们做出了很好的贡献,但答案可以合并。除非另有说明,我会让“投票结束”系统来决定。


The bytecodes are not significantly more or less efficient if you use final because Java bytecode compilers typically do little in the way optimization. The efficiency bonus (if any) will be in the native code produced by the JIT compiler1.

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

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

  • 将变量声明为final防止您意外更改它。 (并向读者表达你的意图。)
  • 将方法声明为final防止在子类中重写。
  • 将一个类声明为final完全阻止子类化。
  • 将字段声明为final阻止子类更改它。
  • 将字段声明为final对线程安全有重要影响;看JLS 17.5 http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5.

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

所以好的做法是使用final(广义上来说)表达您的设计意图,并实现您需要的其他语义效果。如果你使用final仅作为优化提示,您不会取得多大成果。


有一些例外情况final could导致某些平台上的性能略有提高。

  • 在某些情况下,将字段声明为final改变字节码编译器处理它的方式。我在上面举了一个例子。另一种是“常量变量”的情况(JLS 4.12.4 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4)其中一个static final字段的值will be由字节码编译器在当前类和其他类中内联,这可能会影响观察到的代码行为。 (例如,引用常量变量不会触发类初始化。因此,添加final may更改类初始化的顺序。)

  • 可以想象,将字段或局部参数声明为final可能允许进行较小的 JIT 编译器优化,否则不会进行这种优化。但是,任何可以声明为 Final 的字段couldJIT 编译器也可以推断其实际上是最终的。 (只是不清楚 JIT 编译器实际上是否执行此操作,以及这是否会影响生成的本机代码。)

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


1 - This answer assumes that we are talking about a recent JVM with a good JIT or AOT compiler. 1) The earliest Sun Java implementations didn't have a JIT compiler at all. 2) Early Android Java implementations had compilers which did a poor job of optimizing. Indeed the early Android developer documentation advised various source-level micro-optimizations to compensate. This advice has since been removed.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java Finals 是否有助于编译器创建更高效​​的字节码? [复制] 的相关文章

随机推荐

  • 面向对象的 Javascript 最佳实践? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 与 HDF5 相比,为什么从 CSV 导入时 pandas 和 dask 的性能更好?

    我正在使用的系统当前运行大型 gt 5GB csv 文件 为了提高性能 我正在测试 A 从磁盘创建数据帧的不同方法 pandas VSdask http pythondata com dask large csv python 以及 B 将
  • 如何检测 SwiftUI 列表中的向上滚动、向下滚动、顶部和底部

    我有一个列表 我想在列表向上滚动时隐藏工具栏和选项卡栏 我尝试使用以下方法来检测运动 gesture DragGesture onChanged value in if value translation height gt 0 print
  • css3:动画后悬停不起作用

    我有一个 DIV 当 hover 时 它会将 bgcolor 更改为蓝色 单击按钮会添加将 bgcolor 动画为绿色的类 但现在 hover 不起作用 bgcolor 不会更改为蓝色 Why http jsfiddle net EstSi
  • 在 ios 中显示 contenteditable="true" 的 div 键盘

    我有一个 contenteditable true 的 div 我怎样才能通过javascript将焦点集中在这个div上 如果可以在纯js上 没有jquery 在 iOS 6 之前这是不可能的 但幸运的是他们已经改变了这一点 一般来说 您
  • Guice + Jersey 2 + ContainerRequestFilter 和 @Context

    我正在尝试使用 Guice 将依赖项注入到容器请求过滤器 https jax rs spec java net nonav 2 0 SNAPSHOT apidocs javax ws rs container ContainerReques
  • 带有 MySQL 的 PDO 在电子邮件激活中不起作用

    好的 我正在使用服务器通过电子邮件发送给用户的链接中的 GET 设置激活页面 这是我的激活页面 if isset GET success GET success false echo Your account has been activa
  • Flask SQLAlchemy - 仅针对当前会话设置 expire_on_commit=False

    我该如何设置该选项expire on commit False仅适用于 Flask SQLAlchemy 中的当前会话 我可以在初始化时设置该选项SQLAlchemy对象 db SQLAlchemy app session options
  • 无需拥有 Mac 即可构建 iOS 应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如果我错了 请纠正我 我是移动开发新手 我想开发一个应用程序提交到苹果商店 但我对正在开发应用程序的 Mac 的价格感到非常沮丧 假设我确
  • 进程死亡后的内存泄漏和其他资源

    假设一个程序存在内存泄漏 1 当进程死亡 通常或分段错误 时 那些泄漏的内存是否被释放 2 那又怎么样其他资源一个过程成立吗 对于大多数现代操作系统 Linux Windows NT 3 5 左右 来说 是的
  • 如何配置我的 makefile 以进行调试和发布版本?

    我的项目有以下 makefile 我想将其配置为发布和调试版本 在我的代码中 我有很多 ifdef DEBUG宏已就位 因此只需设置该宏并添加 g3 gdwarf2给编译器的标志 我怎样才能做到这一点 CC g g3 gdwarf2 cc
  • 更改后重新处理请求

    我正在尝试使用passport js以通用方式 在调用之前更改配置authenticate 但我找不到之后将请求重定向到它的方法 我这样处理请求 入口点 app get authorize clientId network authUtil
  • zmq::message_t发送后可以重复使用吗?

    我正在使用 ZeroMQ 来实现一个玩具通信协议 这是我第一次使用这个框架 库 现在 在我的协议中 某一方发送多个连续消息 所有消息都具有相同的大小 所以 我想 我会避免重新分配它们 而只是尝试用不同的内容重新填充消息数据缓冲区 例如 zm
  • 从 python 嵌套列表在 pandas 中创建新列

    我有一个熊猫数据框 其中一列有一个嵌套列表 我想从嵌套列表创建新列 Example L 1 2 4 5 6 7 8 9 3 5 我希望嵌套列表中的所有元素都作为列 如果列表有该元素 则该值应为 1 如果没有 则该值应为零 1 2 4 5 6
  • SDK 错误:0x8D07,在 C# 中使用 Canon SDK 时

    我只下载源教程here http www codeproject com Articles 688276 Canon EDSDK Tutorial in Csharp 当我连接佳能 70D 运行它时 出现以下错误 我错过了什么重点 错误 错
  • ajax请求时禁用按钮

    我编写了一条指令 有助于在 ajax 请求挂起时禁用按钮 这是我的指令 directive requestPending http function http return restrict A scope requestPending l
  • 如何检查数组是否为空或存在?

    第一次加载页面时 我需要检查是否有图像image array并加载最后一张图像 否则 我禁用预览按钮 提醒用户按下新图像按钮并创建一个空数组来放置图像 问题是image array in the else一直开火 如果数组存在 它只是覆盖它
  • vim 中的向后杀字?

    是返回并删除一个词的最快方法Esc or Ctrl and db 我想我搞砸了很多 P 并且习惯了使用M
  • Spring Boot - 自动装配数据源 Bean

    我有一个基本的 Spring Boot 应用程序 注释如下 SpringBootApplication public class ApiApplication public static void main String args Spri
  • java Finals 是否有助于编译器创建更高效​​的字节码? [复制]

    这个问题在这里已经有答案了 可能的重复 Java中使用final关键字会提高性能吗 https stackoverflow com questions 4279420 does use of final keyword in java im