Java 性能 - 数组列表与数组的对比,用于大量快速读取

2022-09-03 09:23:28

我有一个程序,我需要在尽可能短的时间内(如毫秒)对类似列表的对象进行100,000到1,000,000次随机访问读取,用于类似元胞自动机的程序。我认为我使用的更新算法已经优化(有效地跟踪活动单元等)。列表确实需要更改大小,但性能并不那么重要。因此,我想知道使用数组而不是数组列表的性能是否足以在如此短的时间内处理如此多的读取时发挥作用。目前,我正在使用ArrayLists。

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

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


答案 1

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

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


答案 2

尝试两者,但要测量。

最有可能的是,你可以把一些东西放在一起,让内部循环使用数组,而不改变那么多代码。我怀疑 HotSpot 已经内联了方法调用,您不会看到任何性能提升。

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