虽然我的标题中有Java,但这可能适用于任何OO语言。我想知道一些新的想法,以提高我正在努力做的事情的表现。
我有一个不断接收Object[]数组的方法。我需要将这个数组中的对象拆分为多个数组(List或其他什么),以便为该方法接收的所有数组的每一列都有一个独立的列表。
示例:
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存储内部列更快..。
发布于 2010-04-29 11:14:14
答案取决于数据和使用情况。在这样的集合中你有多少数据?读写(添加对象数组)的比例是多少?这会影响内部列表的哪些结构更好,以及许多其他可能的优化。
复制数据的最快方法是完全避免复制。如果您知道调用方代码没有进一步修改obj数组(这是重要的条件),那么可能的技巧之一是实现自定义List类作为内部列表使用。在内部,您将存储共享List<Object[]>。每次调用时,我们都会向列表中添加新的数组。自定义内部列表类将知道它代表哪一列(让它是n),当它被要求在m位置给出项时,它将转换m和n,并查询内部结构以获得internalArray.get(m)[n]。这个实现是不安全的,因为对调用者的限制很容易忘记,但在某些条件下可能更快(但是,在其他条件下,这可能更慢)。
发布于 2010-04-29 11:04:36
使用LinkedList实现列列表。它与数据线性增长,为O(1)。(如果使用ArrayList,则必须不时调整内部数组的大小)。
收集完值后,可以将该链接列表转换为数组。如果N是从保存每个列表的3*N参考文献(每个LInkedList都有prevRef/nextRef/itemRef)传递到只引用N的行数。
最好有一个数组来保存不同的列列表,但是当然,这并不是一个很大的改进,只有在预先知道列数的情况下,才能这样做。
希望能帮上忙!
编辑检验和理论表明,ArrayList在摊销成本方面表现较好,即总成本除以已处理项目数。所以不要听从我的“建议”:)
发布于 2010-04-29 11:05:44
我会尝试使用LinkedList作为内部列表,因为它应该具有更好的插入性能。也许将对象arra封装到集合中并使用addAll也会有所帮助。
https://stackoverflow.com/questions/2736698
复制相似问题