Java性能 - 用于大量快速读取的ArrayLists与Arrays

Bry*_*ead 14 java arrays performance arraylist

我有一个程序,我需要在尽可能短的时间内(以毫秒为单位)对类似List的对象进行100,000到1,000,000次随机读取读取,以实现类似细胞自动机的程序.我认为我正在使用的更新算法已经过优化(有效跟踪活动单元等).列表确实需要改变大小,但性能并不重要.所以我想知道使用Arrays而不是ArrayLists的性能是否足以在如此短的时间内处理那么多读取时产生差异.目前,我正在使用ArrayLists.

编辑:我忘了提到:我只是存储整数,所以另一个因素是使用Integer包装类(在ArrayLists的情况下)与int(在数组的情况下).有没有人知道使用ArrayList实际上是否需要3个指针查找(一个用于ArrayList,一个用于底层数组,一个用于Integer-> int),因为数组只需要1(数组地址+偏移到特定的INT)?HotSpot会优化额外的外观吗?这些额外的观察有多重要?

Edit2:另外,我忘了提到我还需要进行随机访问写入(写入,而不是插入).

Ste*_*n C 10

既然您已经提到过您的数组实际上是基本类型的数组,请考虑使用Trove库中的原始类型集合类.

@viking在他的应用程序中使用Trove报告显着(十倍!)加速 - 请参阅注释.另一方面,Trove集合类型与Java的标准集合API不兼容.因此Trove(或类似的库)在所有情况下都不会是答案.


Kev*_*son 9

尝试两者,但要衡量.

最有可能你可以一起破解一些东西,使内循环使用数组而不改变所有那么多代码.我怀疑HotSpot已经内联了方法调用,你将看不到性能提升.

另外,尝试Java 6更新14并使用-XX:+ DoEscapeAnalysis