我正在写一个库,其中:
- 它将需要在各种不同的平台/Java 实现上运行(常见的情况可能是带有 Windows 或 Linux 的 Intel 64 位机器上的 OpenJDK 或 Oracle Java)
- 在我关心对象访问中的 CPU 缓存线效率的情况下,实现高性能是一个优先事项
- 在某些区域,将遍历/处理相当大的小对象图(假设大约 1GB 规模)
- 主要工作量几乎完全是读取
- 读取将分散在对象图中,但不是完全随机的(即会有明显的热点,偶尔读取访问频率较低的区域)
- 对象图将被多个线程同时访问(但不修改)。假设不会发生并发修改,则没有锁定。
是否有一些设计小对象的经验法则/指南,以便它们在这种环境中有效地利用 CPU 缓存线?
我对正确调整对象的大小和结构特别感兴趣,以便例如最常访问的字段适合第一个缓存行等。
注意:我完全意识到这取决于实现,我需要进行基准测试,以及过早优化的一般风险。无需浪费任何进一步的带宽来指出这一点。:-)