由于迭代的执行方式和添加的新条目,如果一个迭代一个集合并复制到另一个集合,性能非常慢。 请考虑以下代码段:
final int num = (int) (1024 * 1024 * 2.1);
final HashLongSet set1 = HashLongSets.newMutableSet();
for (int i = 0; i < num; i++) {
final long oid = r.nextLong();
set1.add(oid);
}
System.out.println("populated first set..");
final HashLongSet set2 = HashLongSets.newMutableSet();
final LongCursor cursor = set1.cursor();
while (cursor.moveNext()) {
set2.add(cursor.elem());
}
System.out.println("populated first set..");
在这种情况下,有没有办法加速第二套人口?我明白,如果我事先知道预期的设置大小,我可以在第二组构造中使用它并使事情变得更快 - 但这并不总是可行的 - 我可以在两者之间插入一些条件,确定哪个输出设置值需要插入或完全扔掉。
答案 0 :(得分:1)
如果使用创建方法中的第一个set as参数创建第二个HashLongSet,它会更快:
final HashLongSet set2 = HashLongSets.newMutableSet(set1);
<强>更新强>
根据您的评论,如果您执行以下操作会怎么样:
countSets
(int) set1.size() / countSets
)
initialCapacity
扩展相应的HashLongSet:set2.ensureCapacity(set2.size() + initialCapacity
)