我最近一直试图提高软件的性能,这些软件花费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上的代码。
答案 0 :(得分:-3)
我认为你做错了什么。 dense_hash_map
针对内存而非速度进行了优化。
我怀疑你的哈希函数真的很慢,或者数据对哈希映射不是很好。
如果hash_map中的值很少(例如&lt; 128),请尝试使用向量并进行线性搜索。它有时会足够快。
如果您有自定义哈希函数,请尝试为其编写基准。如果在二进制文件中内联,Valgring可能会跳过它。
此外,如果您可以为条目分配连续的ID,则可以跳过地图并使用向量来存储数据。并非总是可行,但它总是比hash_map快。
最后,结果[key]应该插入具有默认值的键。值的构造函数可能是问题的来源,也可能是副本(如果您执行任何操作)。同样,这可能会被内联为二进制文件中的优化,因此您无法保证在Valgrind中看到它。如果您不希望插件发生,那么也可能会使地图充分膨胀以产生性能问题。