【发布时间】:2011-10-23 21:07:19
【问题描述】:
我正在接收 XML,需要转换为原始数组或 ArrayList。 在内存和垃圾收集方面的性能方面有很大差异吗? 我的应用程序每秒会创建数千个这样的对象,我需要最小化 GC,因为我需要实时性能。
谢谢
【问题讨论】:
-
这可能会回答你的问题:stackoverflow.com/questions/716597/…
我正在接收 XML,需要转换为原始数组或 ArrayList。 在内存和垃圾收集方面的性能方面有很大差异吗? 我的应用程序每秒会创建数千个这样的对象,我需要最小化 GC,因为我需要实时性能。
谢谢
【问题讨论】:
原始数组效率更高,因为它们不需要包装对象。 Guava 具有由原始数组支持的 List 实现(例如:Ints.asList(int[])),也许这对您来说是一个合理的解决方案:获得集合的力量,但仅在您真正需要时才使用对象。
【讨论】:
原始数组总是更有效,但效率多少取决于用例的具体细节。我最近将性能提高了 7 倍,方法是在最内层的循环中删除 ArrayList,并用原始数组替换它们。用例是一个 O(n^2) 算法,适用于 100-1000 个字符长的列表。然后我做了一个对照实验,将 int[] 数组的性能与 ArrayList 进行比较,有趣的是,随着数组/列表大小变大,JIT 编译器似乎开始起作用,并且性能损失变得更少(仅约 20%)。但是对于小于 500 的列表大小,ArrayList 的性能损失可能高达 10 倍。因此,如果您有一个经常调用的方法,它正在操作许多小列表或数组(就像我的用例一样) ),使用 primitave 数组会对性能产生很大影响。
【讨论】:
正如 Sean Patrick Floyd 所指出的,原始数组的效率要高得多。 但是,在某些情况下,肯定会更喜欢 Collections。但只要你只是迭代对象,就不需要集合。
【讨论】:
链表适用于插入/删除,数组适用于随机访问。
【讨论】: