Array和ArrayList的位置访问性能

Yar*_*evi 3 java arrays performance arraylist

我刚看了这个代码示例:http: //robaustin.wikidot.com/how-does-the-performance-of-arraylist-compare-to-array

导致j = INT_ARRAY [i]的原因; 比j = ARRAY_LIST.get(i)快三倍

我知道ArrayList内部使用一个数组.所以我想详细了解这次添加的额外操作(调用方法,转换,其他JVM注意事项等).

提前致谢.

Jon*_*eet 10

性能将非常很大程度上取决于所涉及的虚拟机,以及各种其他考虑.该文章开头的一揽子声明使我怀疑作者对JVM的性能变化一无所知 - 其余的测试代码证实了这一点.它不会测试足够长的时间,也不会使用任何JVM预热期或类似的东西.哦,它INT_ARRAY.length在测试ArrayList版本时使用,意味着删除了一个潜在的JIT优化源.真的不是一篇好文章.

但是,考虑到ArrayList.get()涉及正常数组访问之外的事情是相当容易的:

  • 无效检查(查看ArrayList引用是否为非null).这是对数组本身的无效性检查的补充,这对于数组和ArrayList情况都是必需的.
  • 可能是虚方法间接,取决于JIT是否设法内联调用
  • 边界检查 - 与数组访问不同,因为列表的大小通常小于数组的长度.

但最终,单个方法调用的性能并不重要.在您的实际使用案例中,这是否重要.您的应用程序是否花费大部分时间从集合中获取单个元素?它是否以文章中所示的循环方式执行此操作,该循环不会执行任何其他操作,因此可以从一个案例或另一个案例中的其他JIT优化中受益?

微观标记很有趣,但在提供有用信息时需要注意其局限性.

  • +1为世界"无效"......我今天总会找借口使用它. (2认同)