在我的自定义物理引擎中,最大的瓶颈是从空间分区(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