0

由于执行迭代和添加新条目的方式,如果一个迭代一组并复制到另一组,则性能非常慢。考虑以下代码片段:

        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..");

在这种情况下,有什么方法可以加速第二组的人口?我知道如果我预先知道预期的集合大小,我可以在第二个集合构造中使用它并让事情变得更快——但这并不总是可能的——我可以在确定值需要哪个输出集合之间插入一些条件插入或完全丢弃。

4

1 回答 1

1

如果在创建方法中使用第一个集合作为参数创建第二个 HashLongSet 是否更快:

 final HashLongSet set2 = HashLongSets.newMutableSet(set1);

更新
根据您的评论,如果您执行以下操作怎么办:

  1. 创建所需数量的 HashLongSet ( countSets),initialCapacity 为(int) set1.size() / countSets
  2. 然后运行循环,将 set1 的数据划分到其他集合中。在每个循环中,您必须检查是否达到了 initialCapacity 并用另一个扩展相应的HashLongSet initialCapacity:)set2.ensureCapacity(set2.size() + initialCapacity
于 2018-01-08T14:45:29.313 回答