我尝试分析程序中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?