由于执行迭代和添加新条目的方式,如果一个在一个集合上进行迭代并复制到另一个集合,则性能将非常缓慢。
考虑以下代码片段:
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..");
在这种情况下,有什么办法可以加快第二盘比赛的人数?我了解,如果我事先知道预期的集合大小,则可以在第二个集合构造中使用它,并使处理速度更快-但这并不总是可能的-我可以在确定值需要输出到哪个输出集合之间插入一些条件完全插入或丢弃。
最佳答案
如果通过在创建方法中使用第一个HashLongSet作为参数来创建第二个HashLongSet,速度会更快:
final HashLongSet set2 = HashLongSets.newMutableSet(set1);
更新
根据您的评论,如果执行以下操作会怎样:
创建初始容量为
countSets
所需的任意多个HashLongSet((int) set1.size() / countSets
)然后运行循环,将set1的数据划分到其他集合上。在每个循环中,您都必须检查是否达到了initialCapacity,并使用另一个
initialCapacity
:set2.ensureCapacity(set2.size() + initialCapacity
扩展相应的HashLongSet)