【发布时间】:2014-06-23 13:08:15
【问题描述】:
在设计 java 类时,对于实现 CPU 缓存友好性有哪些建议?
到目前为止,我学到的是应该尽可能多地使用 POD(即 int 而不是 integer)。因此,在分配包含对象时,数据将被连续分配。例如
class Local
{
private int data0;
private int data1;
// ...
};
比缓存更友好
class NoSoLocal
{
private Integer data0;
private Integer data1;
//...
};
后者将需要对 Integer 对象进行两次单独的分配,这些对象可以位于内存中的任意位置,尤其是。 GC 运行后。 OTOH 第一种方法可能会在数据可以重复使用的情况下导致数据重复。
有没有办法让它们在内存中彼此靠近,这样父对象及其包含的元素就会立即在 CPU 缓存中,而不是任意分布在整个内存中,而且 GC 会将它们保持在一起?
【问题讨论】:
-
您想保持任意引用类型实例“在内存中彼此靠近”还是专门针对盒装 POD?
-
更多的是关于保持相关对象,即所有元素(不仅是它们的引用)在内存中彼此靠近。
-
如果你真的担心这个,Java 不适合你
-
所以我做了一些基准测试:在单线程场景中,差异在 1.2 和 1.9 之间,有利于本地数据。在多线程场景下,本地数据的优势在9-20倍之间。因此,在服务器端代码的数据局部性上花费一些精力肯定是值得的……
-
在我的 i7 4770 上测试了相同的代码(其他测试是在我的 i5 笔记本电脑上):这里在 MT 场景中本地数据的处理速度比使用引用的数据快 35 倍。
标签: java caching garbage-collection jvm