1

有没有一种方法可以迭代 Collection 并且只检索属性的子集而不加载/卸载每个要缓存的完整对象?'因为当我只需要一些属性时,加载/卸载整个(可能是大的)对象似乎是一种浪费,尤其是在对象很大的情况下。加载这些不必要的数据时,可能会导致不必要的缓存冲突,对吧?

当我的意思是“加载到缓存”时,我的意思是通过处理器“处理”该对象。所以会有 ex: 10 个属性的对象。在迭代循环中,我只使用其中的 1 个。在这种情况下,我认为将所有其他 9 个属性从内存加载到处理器是一种浪费。难道没有解决方案只提取属性而不加载完整对象吗?

另外,像谷歌的番石榴这样的东西是否在内部解决了这个问题?

谢谢你!

4

2 回答 2

3

它通常不是第一个查看的地方,但您遇到缓存共享问题肯定不是不可能的。如果您真的确信(通过对硬件计数器的实际分析或分析)这是一个值得解决的瓶颈,您可能会考虑更改数据结构以使用并行基元数组(类似于某些 DB 架构中基于列的数据库存储) . 例如,一个“列”作为 a float[],另一个作为 a short[],第三个作为 a String[],都由相同的标识符索引。此结构允许您“查询”单个列,而无需将当前不需要的任何列加载到缓存中。

我有一些真正受益于 C 的低级算法代码struct。我对各种替代方案进行了一些微基准测试,发现并行阵列是我的算法最有效的选择(可能适用于您自己的算法,也可能不适用于您自己的算法)。

java.util请注意,与在集合中使用对象相比,并行数组结构的维护和变异要复杂得多。所以我要重申——我只会在你确信好处值得痛苦之后才会采用这种方法。

于 2013-02-19T23:09:44.920 回答
2

Java 没有办法管理加载到处理器缓存,也没有办法改变 JVM 处理对象的方式,所以答案是否定的。Java 不是一种低级语言,它对程序员隐藏了这些细节。

JVM 将决定它加载多少对象。它可能会以某种预读优化的形式加载整个对象,或者仅加载您实际访问的字段,或者在 JIT 编译期间分析代码并将两者结合起来。

另外,你担心你的物体有多大?我很少看到有多个领域的课程,所以我不会考虑那么大。

于 2013-02-19T06:32:02.213 回答