【发布时间】:2011-09-16 19:20:04
【问题描述】:
我正在实现 tbb 的并发哈希映射,以将其性能与一组其他并发哈希表进行比较。
但是我得到的性能是可怕的,我简直不敢相信它与其他并发哈希表相比这么慢
这是我的实现:
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
【问题讨论】:
-
您在编译时没有启用优化?
-
什么是“其他实现”?
-
不管是什么原因,在禁用优化的情况下比较性能是没有意义的。您不妨比较一下卸下车轮后两辆车的速度。
-
@Steven:这与调试无关。如果打开优化会破坏您的代码,那么首先破坏的是您的代码。
-
@Steven:我没有时间看太深,希望其他人可以,但是这样看:TBB 数据结构不仅仅是业余爱好者的代码,它们由一些最优秀的人编程,并在其上进行测试。如果您遇到性能问题,要么是您与之比较的结构被破坏(例如,没有正确处理线程安全),要么您的测试代码没有反映数据结构的假设方式在实践中使用。我真的非常怀疑这不是 TBB 的错。试着看看你是否可以简化测试并找出问题。
标签: c++ hashmap tbb concurrenthashmap