c++ - TBB 并发 HashMap

标签 c++ hashmap tbb concurrenthashmap

我正在实现 tbb 的并发 HashMap ,以将其性能与一组其他并发哈希表进行比较。

但是我从中得到的性能是可怕的,我简直不敢相信它比其他并发哈希表慢

这是我的实现:

class TBB: public TestDs{
    typedef tbb::concurrent_hash_map<int,int, HashCompare<int> > hash_t;
private:
        hash_t _ds;
public:
        TBB(const Configuration& config) : _ds(config.initial_count) {
        }

    bool containsKey(int key) {
        hash_t::accessor a;

        if(_ds.find(a,key)){
            return true;
        }
        else 
            return false;
    }

    int get(int key) {
        hash_t::accessor a;

        if(_ds.find(a,key)){
             return (int)(a->second);
        }
        else 
            return 0;
    }

    int put(int key, int value) {
        return _ds.insert( std::make_pair(key, value) );
    }

    int remove(int key) {
        return _ds.erase(key);
    }

    int size() {
        return _ds.size();
    }
    const char* name() {
        return "TBB";
    }
    void print() {}
    void shutdown() {}

};

有没有人看到我的实现有任何问题或知道它可能执行缓慢的任何原因? 它在单线程环境中插入 200,000 个元素需要 30 多分钟。从正确的角度来看,几乎所有其他表都在不到 5 分钟的时间内执行了此测试。

这是我的构建代码:

-w  -DNDEBUG -g -msse2 -m32  -DINTEL -D_REENTRANT -lrt -pthread -fno-strict-aliasing -l cds -l tbb -lllalloc 

更新:我调整了我的测试代码以将哈希表预填充为 1000,而不是 100,000。 再次运行时,tbb 执行 92 op/sec,而另一个实现执行 89431 op/sec。 (64线程环境)...说的好像不太对....

附加信息:计算机是 HP Z600 工作站,配备 6gb 内存和 6 个内核。

注意交叉定位:http://software.intel.com/en-us/forums/showthread.php?t=86119

最佳答案

HashCompare::hash() 返回 sizeof(int),我猜这意味着每个条目都映射到同一个桶中。看起来您没有将它用作哈希表,更多的是链接列表。

您可以尝试使用 Boost 的哈希:

#include <boost/functional/hash.hpp>

template<typename K> 
struct HashCompare { 
    static size_t hash( const K& key )                  { return boost::hash_value(key); } 
    static bool   equal( const K& key1, const K& key2 ) { return ( key1 == key2 ); } 
}; 

关于c++ - TBB 并发 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7449382/

相关文章:

c++ - 在动态内存分配中出现运行时错误

c++ - 将 std::unique_ptr<Derived> 转换为 std::unique_ptr<Base>

java - JDK 1.6及以上版本HashMap的空键机制改变有什么好处?

c++ - 如何在 Windows 上安装 TBB 并使其与 Eclipse 一起工作

c++ - 普通指针与自动指针 (std::auto_ptr)

c++ - 计算数组中唯一字符的函数

java - 哈希表列表更新所有字符串值

java - 将 Map 的键值对作为对象访问

c++ - 如何在 tbb 流程图中中止节点及其子节点的执行

c++ - 处理与 tbb 顺序的大数据