【问题标题】:How to write Java JIT optimization friendly code?如何编写 Java JIT 优化友好代码?
【发布时间】:2011-06-30 23:37:59
【问题描述】:

当您想从代码中榨取最后一点性能时,您会希望尽可能地利用 JIT 优化。例如,标记方法 final 以便于方法内联,避免关键位置的多态等。

但是我找不到 Java 程序员可以用来“提示”JIT 编译器以获得更快代码的任何参考或选项列表?我们不应该从 JIT 获得低延迟性能的“最佳编程”实践列表吗?

【问题讨论】:

  • 不是您问题的答案,但如果您对高性能 Java 感兴趣,您可能会对鲜为人知的 fastutil 库感兴趣。它是集合框架的高性能扩展。
  • 你能解释一下你为什么对这个感兴趣吗?你有性能问题吗?还是纯粹的学术? :-)
  • 我遇到的性能问题大多可以通过调整 GC 或改进算法来解决。但是,如果我必须超越这一点,例如图像处理、模式识别等,我想知道我手中还有哪些其他性能优化工具。你可以称之为学术。

标签: java real-time


【解决方案1】:

编写 JIT 友好代码的最佳方式是编写直接、简单的代码,因为这是 JIT 寻找的并且知道如何优化的代码。没有技巧!

同样,不同的 JVM 有不同的 JIT,所以为了确保你的代码能很好地与它们一起工作,你不能依赖它们中的任何一个。

提高 JIT 性能的常用方法是通过 JVM 的外部配置。由于现在大多数 JVM 都知道如何直接内联 code 小方法调用,因此大多数性能提升来自配置垃圾收集器。在这里花费了很多精力来避免在收集时停止程序,并且您可以根据您对底层硬件的配置方式以及比其他硬件更好的知识进行相当多的调整。但不是 Java 代码,它需要直截了当。

【讨论】:

  • 我建议尝试查找 Cliff Click 的“Java 技术性能神话暴露”JavaOne 演讲的幻灯片或 PDF(Hotspot 黑客,前 Sun,在 Azul Systems 工作了一段时间)。他的blog 也总是有有趣的 JVM 内部讨论。而且,顺便说一句,“使方法最终帮助内联”“优化”只是一个神话。
  • @vanza 幻灯片很难找到。但是 final 方法至少有一个优点:JIT 不必以某种方式推断没有足够的子类,但总是可以避免动态调用——这在某些情况下应该会获得一些小的性能提升。并不是说那会很明显,但是嘿;)
  • @Voo:Hotspot 已经尽可能地避免了动态调用(例如,加载了实现它的单个具体类的接口或抽象类),不需要“final”。本着原始信息的精神,以及我一直从 JIT 黑客那里听到的内容:在代码中有意义时使用“final”(和其他语言功能),而不是因为您认为它会使您的代码更快。跨度>
  • @Voo JVM 类加载器已经知道加载了哪些类。如果从未加载过子类,则不需要动态运行时方法查找。
  • @Voo & @vanza,我一直都知道 final 会增加性能优势,直到最近我读到一些关于 JVM 技巧以避免多态性的内容。我的问题是,我如何学习这些东西/技巧并知道要优化什么和不优化什么?我对主要用于生产系统的 Sun JVM 最感兴趣。
【解决方案2】:

HotSpot 的作者和其他人一再表示,最好的方法是编写简单直接的代码。

【讨论】:

  • +1:JIT 寻找它知道如何优化的常见模式。如果您编写令人困惑的代码或具有不寻常结构的代码,它会混淆 JIT(这很容易完成,它只是一个程序)并且它也不会优化代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2021-06-23
  • 2021-03-25
  • 2011-01-22
  • 2015-06-02
相关资源
最近更新 更多