【问题标题】:Filling ArrayList vs LinkedList填充 ArrayList 与 LinkedList
【发布时间】:2014-10-16 12:19:19
【问题描述】:

我一直认为LinkedList 的填充速度比ArrayList 快。据我所知ArrayList 基于长度有限(常量)的简单数组。所以每次数组超出范围时,都会创建一个范围更大的新数组。 LinkedList 要简单得多。它没有任何限制(内存除外),因此应该更快地填充。但我运行下一个代码:

 public static void main(String[] args) {
        int length = 7000000;

        List<Integer> list = new LinkedList<Integer>();
        long oldTime = System.currentTimeMillis();
        for (int i = 0; i < length; i++) {
            list.add(i);
        }
        System.out.println("LinkedList fill: " + (System.currentTimeMillis() - oldTime));

        list = new ArrayList<Integer>();
        oldTime = System.currentTimeMillis();
        for (int i = 0; i < length; i++) {
            list.add(i);
        }
        System.out.println("ArrayList fill: " + (System.currentTimeMillis() - oldTime));
    }

输出是:

LinkedList fill: 3936
ArrayList fill: 628

为什么会这样?

【问题讨论】:

  • 因为您的基准测试存在缺陷。 stackoverflow.com/questions/504103/…
  • 您尝试交换它们吗?首先是arraylist,然后是linkedlist?
  • 如果反之亦然,即先是 ArrayList,然后是 LL?还将长度传递给 ArrayList 构造函数,看看会发生什么?
  • 没有任何变化。您可以在两个不同的程序中分别运行它们。

标签: java arraylist linked-list performance-testing microbenchmark


【解决方案1】:

您无法像在 Java 中那样对性能进行真正的基准测试。请参阅How do I write a correct micro-benchmark in Java?,了解有关可能出错的许多事情的更详细说明。

如果我 test your codejmh 我得到以下结果:

Benchmark                      Mode  Samples  Score   Error  Units
c.a.p.SO26404256.arrayList     avgt        5  7.661 ± 0.672  ms/op
c.a.p.SO26404256.linkedList    avgt        5  9.675 ± 1.213  ms/op

所以填充 LinkedList 似乎比填充 arrayList 稍慢,但差异比您的测试显示的要小得多。

至于差异的原因,可能是因为 LinkedList 的每个元素都被包裹在一个Node 中:这意味着更多的对象创建和更多的垃圾回收。而且 ArrayList 中的数组副本造成的损失可能比您想象的要少,因为它们是高度优化的。

【讨论】:

  • Oracle Wiki 提供的一站式链接。也请参阅相关链接..
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多