添加到大型Java集合,性能瓶颈

Jam*_*sev 7 java collections performance

我正在尝试将一百万个对象添加到列表中.这样做的时间比我耐心等待的时间长.随着每一步的进行,似乎也需要越来越长的时间.

    int size = 1000000;
    Deque<DatastoreElement> content = new LinkedList<DatastoreElement>();

    for (int i = 0; i < size; i++) {

        String k = Utils.getRandomStringOfLength(20);
        String v = Utils.getRandomStringOfLength(300); // goes faster with smaller number

        int metaHash = random.nextInt(10) + 1;
        KVPair kvp = new KVPair(k, v);
        DatastoreElement dse = new DatastoreElement(metaHash, kvp);

        content.addLast(dse); // confirmed problem is here

        if (i % 10000 == 0) {
            System.out.println(i);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我尝试添加内容List,Set结果非常相似.它会快速启动并在一些数字后扼流圈.

我应该使用什么样的集合来存储大量相似的元素?我在这里想念一些简单的东西吗

小智 11

此问题是不与在一般集合,并且LinkedList如图所示(已经O(1)添加特性).

因此可能的嫌疑人是内存的颠簸/交换.确保JVM有足够的内存,系统有更多..

从切换LinkedListArrayList(或ArrayDeque)将继续O(1) 摊销的性能,但可能轻微每个项目的开销更少.(开销,如果这种减少甚至重要,取决于添加的对象的大小和后备存储的填充率.)

  • 实际上`LinkedList`将永远更糟,因为内存节点不是连续的内存,就像在`ArrayList`中一样,可以在同一页面中缓存 (2认同)