检索选择属性的更好性能方法Java中的大对象集合

时间:2013-02-18 12:18:12

标签: java performance collections guava

是否有一种方法可以迭代Collection而只检索一部分属性,而无需加载/卸载每个完整对象进行缓存? '当我只需要一些属性时,加载/卸载整个(可能是大的)对象似乎是浪费,特别是如果对象很大的话。加载这些不必要的数据时可能会导致不必要的缓存冲突,对吗?

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

此外,像谷歌的Guava这样的内部解决了这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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

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