在我的自定義物理引擎中,最大的瓶頸是從空間分區(2D網格)獲取所有主體的方法,並返回一個只包含唯一指向主體的指針的集合。std :: vector比std :: unordered_set更快嗎?
template<typename T, typename V> bool contains(const T& mContainer, const V& mValue)
{
return std::find(std::begin(mContainer),
std::end(mContainer), mValue) != std::end(mContainer);
}
const vector<Body*>& GridInfo::getBodiesToCheck()
{
bodiesToCheck.clear();
for(auto& query : queries)
for(auto& body : *query)
if(!contains(bodiesToCheck, body)) bodiesToCheck.push_back(body);
return bodiesToCheck;
}
使用探查器顯示瓶頸在「contains」方法中。
顯然,std::unordered_set
將是這裏的「理想」解決方案。但是,它比當前的解決方案慢很多。我也試過google::dense_hash_set
,這比std::unordered_set
快,但仍然比當前的解決方案慢。
const unordered_set<Body*>& GridInfo::getBodiesToCheck()
{
bodiesToCheck.clear();
for(auto& query : queries)
for(auto& body : *query)
/*if(!contains(bodiesToCheck, body))*/ bodiesToCheck.insert(body);
return bodiesToCheck;
}
爲什麼比std::vector
慢 「正確」 的容器?
有什麼辦法可以進一步加速這個方法嗎?
性能分析結果僅適用於'contains'?記住搜索設置可能會更快,但插入比向量慢。 – 2013-04-08 13:16:04
我假設你沒有犯這樣的錯誤,但只是爲了真正確定,你在嘗試'std :: unordered_map'時沒有使用'std :: find',是嗎? – 2013-04-08 13:18:56
@stardust_ Profiler將「getBodiesToCheck()」方法顯示爲瓶頸。如果我使用std :: vector版本,getBodiesToCheck()(瓶頸瓶頸:P)中的瓶頸就是調用「contains」 – 2013-04-08 13:21:30