【发布时间】:2016-12-19 17:08:27
【问题描述】:
我开始看到越来越多的基准测试证明 ArrayList 在以下“大型”插入示例的性能方面可以碾压 LinkedList: Gluelist
Adding(1M) Elements (5 Tests Avg.)
LinkedList: 174.8 milliseconds
ArrayList: 76.4 milliseconds
GlueList: 39.2 milliseconds
Adding(10M) Elements (5 Tests Avg.)
LinkedList: 8975.6 milliseconds
ArrayList: 4118.2 milliseconds
GlueList: 3320.1 milliseconds
我使用 JDK8.latest 在 RHEL 7.2 上运行了类似的测试,并看到了类似的结果。我的印象是,即使在最坏的情况下,LinkedList 插入也是 O(1),而 ArrayList 由于复制操作而需要 > O(1)(我意识到我们可以讨论摊销成本,但这超出了范围) .我的问题是:鉴于 ArrayList 在接近容量时强制执行复制操作,LinkedList 的性能如何比 ArrayList 差?
【问题讨论】:
-
猜测:
System.arraycopy是一个高效的、打包的memcpy,而LinkedList插入需要大量分配并破坏缓存局部性。 -
“我意识到我们可以讨论摊销成本,但这超出了范围)” - 您正在测量摊销成本。为什么要把它排除在讨论之外?
标签: java performance arraylist linked-list