如何编写友好于Java JIT优化的代码?

7

当你想要从代码中挤出最后一点性能时,你会尽可能地利用JIT优化。例如,将方法标记为final以便于方法内联,在关键位置避免多态等。

但我找不到任何参考或选项列表,可以用来'提示' JIT编译器生成更快的代码?难道我们不应该有一份关于JIT低延迟性能的'最佳编程'实践列表吗?


这不是你问题的答案,但如果你对高性能Java感兴趣,你可能会对鲜为人知的fastutil库感兴趣。它是集合框架的高性能扩展。 - Timothy Jones
你能澄清一下你为什么对此感兴趣吗?你是否遇到了性能问题?还是纯粹出于学术目的呢? :-) - drekka
我遇到的性能问题大多可以通过调整垃圾回收器或改进算法来解决。然而,如果我需要超越这个范围,例如图像处理、模式识别等,我想知道我手头还有哪些其他性能优化工具。你可以称之为学术性质。 - Sajid
2个回答

10

编写适合JIT的代码的最佳方法是编写直接、简单的代码,因为这正是JIT所寻找的并且知道如何进行优化的事物。不要使用任何技巧!

此外,不同的JVM具有不同的JIT,因此为了确保您的代码在所有JVM上都能够良好运行,您不能依赖于它们中的任何一个。

提高JIT性能的通常方式是通过对JVM进行外部配置。由于大多数现代JVM都知道如何直接内联小方法调用,因此大部分性能增益来自于垃圾收集器的配置。在这里,我们花费了很多精力来避免在收集时停止程序,并且您可以根据对底层硬件配置以及哪些设置比其他设置更有效的了解来进行微调。但不要触及Java代码,它需要直接和简单。


2
我建议尝试查找由Cliff Click(Hotspot黑客,前Sun员工,已在Azul Systems工作一段时间)进行的“Java Technology Performance Myths Exposed” JavaOne演讲的幻灯片或PDF。他的博客(http://www.azulsystems.com/blog/)也总是有有趣的JVM内部讨论。顺便说一句,“将方法声明为final以帮助内联”的“优化”只是一个神话。 - vanza
@vanza 嗯,幻灯片非常难找。但最终方法至少有一个优点:JIT不必以某种方式推断是否存在适当的子类,而是始终可以避免动态调用——这在某些情况下应该会获得一些小的性能增益。虽然可能不会引起注意,但嘿 ;) - Voo
1
@Voo:热点已经在可能的情况下避免使用动态调用(例如,加载了实现它的单一具体类的接口或抽象类),因此不需要使用“final”。按照原始信息的精神以及我一直听到的JIT黑客的建议:在你的代码中只有在有意义的时候使用“final”(和其他语言特性),而不是因为你认为它会使你的代码更快。 - vanza
@Voo和@vanza,我一直知道final可以提高性能,直到最近我读到了一些JVM技巧来避免多态。我的问题是,我该如何学习这些技巧并知道什么需要优化,什么不需要优化?我主要对生产系统中使用的Sun JVM感兴趣。 - Sajid
@Sajib:再次阅读评论。你不需要做任何事情。JVM 足够聪明,可以优化可优化的内容。只需编写清晰易懂且易于维护的代码即可。只要不要编写 O(n^2) 算法,而可以使用更快的算法,即使是 JVM 也无法帮助你。 - vanza
显示剩余2条评论

7

HotSpot的作者和其他人已经多次表示,最好的方法是编写简单明了的代码。


1
+1:JIT 寻找它知道如何优化的常见模式。如果您编写混乱的代码或具有不寻常结构的代码,它将使 JIT 困惑(这很容易做到,它只是一个程序),并且它不会像预期那样优化代码。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接