google :: dense_hash_map vs boost :: unordered_map性能问题

时间:2016-01-05 15:35:00

标签: c++ performance boost hashmap

我最近一直试图提高软件的性能,这些软件花费60%的时间在hashmap上进行搜索(使用valgrind profiler确认)。

目前的实施正在使用boost::unordered_map<long long, FrequencyKey>。我想将它与google::dense_hash_map<long long, FrequencyKey>进行比较。我在代码中更改了一行

boost::unordered_map<long long, FrequencyKey> result;

google::dense_hash_map<long long, FrequencyKey> result;
result.set_empty_key(-1);

地图的界面在2个地方被调用。在大循环result.clear()之前。在循环result[key]内。

使用boost::unordered_map<long long, FrequencyKey>我的软件性能 118 req / s 。根据上面列出的更改,我得到 0.5 req / s

我显然做错了什么,但在完成文档和github code之后我无法弄明白。

我正在使用gcc / g ++ 4.4.7编译CentOS 6.5上的代码。

1 个答案:

答案 0 :(得分:-3)

我认为你做错了什么。 dense_hash_map针对内存而非速度进行了优化。

我怀疑你的哈希函数真的很慢,或者数据对哈希映射不是很好。

如果hash_map中的值很少(例如&lt; 128),请尝试使用向量并进行线性搜索。它有时会足够快。

如果您有自定义哈希函数,请尝试为其编写基准。如果在二进制文件中内联,Valgring可能会跳过它。

此外,如果您可以为条目分配连续的ID,则可以跳过地图并使用向量来存储数据。并非总是可行,但它总是比hash_map快。

最后,结果[key]应该插入具有默认值的键。值的构造函数可能是问题的来源,也可能是副本(如果您执行任何操作)。同样,这可能会被内联为二进制文件中的优化,因此您无法保证在Valgrind中看到它。如果您不希望插件发生,那么也可能会使地图充分膨胀以产生性能问题。