[英]Adding to a large Java collection, performance bottleneck
我正在尝试将一百万个对象添加到列表中。 这样做的时间比我耐心等待的时间长。 随着每一步的进行,似乎也需要越来越长的时间。
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);
}
}
我尝试将内容添加到List
, Set
具有非常相似的结果。 它会快速启动并在一些数字后扼流圈。
我应该使用什么样的集合来存储大量相似的元素? 我在这里想念一些简单的东西吗
这个问题不是一般的集合, 也不是如图所示的LinkedList
(具有O(1)
添加特性)。
因此可能的嫌疑人是内存的颠簸/交换。 确保JVM有足够的内存,系统有更多..
从LinkedList
切换到ArrayList
(或ArrayDeque
)将保持O(1)
分摊的性能,但每个项目的开销可能 略微减少。 (开销,如果这种减少甚至重要,取决于添加的对象的大小和后备存储的填充率。)
String#intern()
的Flyweight模式,因此可以收集冗余实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.