【发布时间】:2010-04-29 10:57:37
【问题描述】:
虽然我在标题中使用了 Java,但这可能适用于任何 OO 语言。 我想知道一些新想法,以提高我正在尝试做的事情的性能。
我有一个不断接收 Object[] 数组的方法。我需要通过多个数组(列表或其他东西)拆分此数组中的对象,以便我为该方法接收的所有数组的每一列都有一个独立的列表。
例子:
List<List<Object>> column-oriented = new ArrayList<ArrayList<Object>>();
public void newObject(Object[] obj) {
for(int i = 0; i < obj.length; i++) {
column-oriented.get(i).add(obj[i]);
}
}
注意:为简单起见,我省略了对象和内容的初始化。
我上面显示的代码当然很慢。我已经尝试了其他一些方法,但想听听一些新的想法。
如果你知道它对性能非常敏感,你会怎么做?
编辑:
我测试了一些东西,发现:
我没有使用 ArrayList(或任何其他集合),而是将 Object[] 数组包装在另一个对象中以存储各个列。如果此数组达到其容量,我将创建另一个大小为两倍的数组,并使用 System.copyArray 将内容从一个复制到另一个。令人惊讶的是(至少对我而言)这比使用 ArrayList 存储内列要快...
【问题讨论】:
-
Object[] obj中包含什么?它实际上是同质类型的数组,还是您将其用作某种异构记录?obj应该是数据库表中的一行吗? “面向列”真的是数据库中的一张表,每一个嵌套的列表就是一整列吗? -
是否绝对有必要更改值的存储方式?如果你有足够的抽象,那么你可以只改变访问策略而不用改变数据结构。
-
@polygenelubricants 是的,您可以将其视为数据库中的一条记录,我想将其转换为面向列的表。就像你说的那样。
-
@halfwarp: ...为什么不直接使用数据库???为什么要将这个列表列表存储在 Java 中?
-
@halfwarp:在内存中使用这种面向列的表示有什么好处?看起来你有足够的抽象,因为你说你用自己的
Object[]进行了列试验。也许您实际上并不需要一个实际的面向列的存储,而可以只为列提供一个视图Iterator<?>。
标签: java performance algorithm column-oriented