gpt4 book ai didi

java - 我可以在 Java 代码中做什么来优化 CPU 缓存?

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

在编写 Java 程序时,我是否会影响 CPU 如何利用其缓存来存储我的数据?例如,如果我有一个经常被访问的数组,如果它足够小以适合一个高速缓存行(通常在 64 位机器上为 128 字节)是否有帮助?如果我将一个经常使用的对象保持在该限制内,我可以期望它的成员使用的内存靠近在一起并保留在缓存中吗?

背景:我正在构建一个压缩的 digital tree ,这深受 Judy arrays 的启发。 ,在 C 语言中。虽然我主要关注它的节点压缩技术,但 Judy 将 CPU 缓存优化作为中心设计目标,节点类型以及在它们之间切换的启发式方法都受此影响很大。我想知道我是否也有机会获得这些好处?

编辑:到目前为止,答案的一般建议是,当您离机器如此之远时,不要尝试微优化机器级细节 java 。我完全同意,所以觉得我必须添加一些(希望)澄清评论,以更好地解释为什么我认为这个问题仍然有意义。这些如下:

由于计算机的构建方式,有些事情通常更容易处理。我已经看到 Java 代码在压缩数据(来自内存)上运行速度明显更快,即使解压缩必须使用额外的 CPU 周期。如果数据存储在磁盘上,原因很明显,但在 RAM 中当然是相同的原理。

现在,计算机科学对这些东西有很多话要说,例如,引用局部性在 C 中很棒,我想它在 Java 中仍然很棒,如果它有助于优化运行时做更多事情,也许更是如此聪明的东西。但是你如何完成它可能会非常不同。在 C 中,我可能会编写代码来管理更大的内存块并使用相邻的指针来存储相关数据。

在 Java 中,我不能(也不想)知道很多关于特定运行时将如何管理内存的信息。所以我也必须将优化提升到更高的抽象层次。我的问题基本上是,我该怎么做?对于引用的局部性,在我在 Java 中工作的抽象级别上,“紧密结合”是什么意思?同一个对象?同类型?同一个数组?

一般来说,我不认为抽象层会改变“物理定律”,打个比方。每次空间不足时将数组大小加倍也是 Java 中的一个好策略,即使您不再调用 malloc()

最佳答案

Java 获得良好性能的关键是编写惯用的代码,而不是试图智取 JIT 编译器。如果您编写代码试图影响它以某种方式在 native 指令级别执行操作,那么您更有可能自取其辱。

这并不是说引用位置等共同原则无关紧要。它们确实如此,但我认为使用数组等是性能感知、惯用代码,但并不“棘手”。

HotSpot 和其他优化运行时在如何为特定处理器优化代码方面非常聪明。 (例如,check out this discussion. )如果我是专业的机器语言程序员,我会编写机器语言,而不是 Java。如果我不是,那么认为我可以比专家更好地优化我的代码是不明智的。

此外,即使您确实知道为特定 CPU 实现某些东西的最佳方式,Java 的美妙之处还是一次编写,随处运行。 “优化”Java 代码的巧妙技巧往往会使 JIT 更难识别优化机会。遵循常见习惯用法的直截了当的代码更容易被优化器识别。因此,即使您为您的测试平台获得了最好的 Java 代码,该代码也可能在不同的架构上表现得很糟糕,或者充其量无法利用 future JIT 中的增强功能。

如果您想要良好的性能,请保持简单。 真正聪明人的团队正在努力加快速度。

关于java - 我可以在 Java 代码中做什么来优化 CPU 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1478280/

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