即使使用廉价哈希(profiled),unordered_map也很慢

时间:2016-06-07 02:34:26

标签: c++ performance profiling unordered-map

我尝试分析程序中CPU密集型部分。

让我震惊, unordered_map isContain 插入删除 真的很慢

以下是分析结果的真实示例: -

Physic_Object* cave = ... it is a function argument ...
if(cave->id==3){                            //< 0.1% simple int
    int asdfdssd=0;
}
//"concaves" is MyEncapsulatorOf_unordered_map<Physic_Object*> (it is a field)
//There are about 500-1000 elements in the unordered_map.
if (phy_concaves.isContain(cave)) {         //0.8%  unordered_map "isContain" 
    phy_concaves.remove_immediate(cave);    //4.9%  unordered_map "iscontain" + "erase"
    cave->finalize_inverse();               //6.0%  a lot of unordered_map function
    delete cave;                            //0.7%  simple delete
}else {
}

这是我的廉价哈希函数。

//Physic_Object.h
public:virtual long hqHashCode() const override final {
    return id; 
    //id is +1 every time when new Physic_Object is create
    //I have a static int "id_runner" to track.
}

从整个档案中, unordered_map 的操作吞噬了我游戏的70%-80%。

问题: unordered_map真的很慢,或者我的代码有什么问题吗?
更具体地说,插入/删除是否常见于40+以上的简单算术运算?

以下是我创建unordered_map的方法,我认为没有任何错误,但提供以防万一。

//MyEncapsulatorOf_unordered_map<K> ,  K can be pointer or value
template<typename T2> static const
    T2 * ptr(T2 const& obj) { return &obj; } //turn reference into pointer!
template<typename T2> static
    T2 * ptr(T2 * obj) { return obj; } //obj is already pointer, return it!
template< class T2>class structTPtr1 {
    public:
    std::size_t operator()(T2 const& t) const{
        std::size_t h1 = ptr(t)->hqHashCode();
        return h1;
    }
};
template< class T2>class structTPtr2 {
    public: bool operator() (const T2 & t1, const T2&t2) const {
        return t1 == t2;
    }
};
public:std::unordered_set<K, structTPtr1<K>, structTPtr2<K>>main;

请注意,我是从visual c ++以调试模式运行的,但是发布模式会产生类似的结果。

Why Unordered_Map hashing is too slow then my simple array hash似乎是最相关的问题,但它并不表示/配置unordered_map的性能。

我也不认为这是关于gcc的。因此,此链接可能不相关。 Is gcc std::unordered_map implementation slow? If so - why?

0 个答案:

没有答案