【问题标题】:Performance of C++ Google dense_hash_set insertsC++ Google dense_hash_set 插入的性能
【发布时间】:2015-10-17 21:34:41
【问题描述】:

我有一个 C++ 程序正在插入大约。将 1800 万个数字类型 uint64_t 输入谷歌 dense_hash_set

数字是所有小于 2^64 的偶数

N >= radical(N)^4.

插入速度比插入 1800 万个随机数或 1800 万个序列号慢一个数量级。

在执行插入时,代码似乎大部分时间都在执行语句

if ( test_empty(bucknum) )

将 1800 万个项目插入到 dense_hash_set 中是否合理?

有什么方法可以加快插入速度?

相关行是

uint64_t N;
google::dense_hash_set<uint64_t> evencandidates;
evencandidates.set_empty_key(-1);
.....
evencandidates.insert(N);

【问题讨论】:

  • 也许是因为你必须检查是否 N>=radical(N)^4 ?您甚至没有提供任何代码。我们该如何回答?
  • 性能不佳与检查 N>=radical(N)^4 无关(我之前使用 std::unordered_set 进行插入,这也快了一个数量级)。完整的代码很复杂,所以我没有在帖子中包含它,已经添加了相关行。
  • @Armchair:然后做一个最小的、完整的例子来演示这个问题。作为奖励,当您删除不需要证明性能不佳的部分代码时,您可能会发现问题出在其他地方!

标签: c++ hashmap


【解决方案1】:

通过用 std::tr1::hash 替换默认哈希函数解决。密集哈希集的声明变为:

google::dense_hash_set<uint64_t, std::tr1::hash<uint64_t> > evencandidates;

选择要存储的数字的标准,

N >= radical(N)^4 and N even

结果存储的数字有很多公因数,尤其是大多数数字的几个 2 的幂。选择一个适合这组数字的哈希函数可以解决性能问题。

【讨论】:

    猜你喜欢
    • 2017-09-13
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2016-08-15
    • 2016-12-10
    相关资源
    最近更新 更多