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
慢?
我有没有办法进一步加速这个方法?
std::unordered_map
时没有使用std::find
,对吗? - Christian Raustd::unordered_set
上进行一些可能的迭代还很困惑。因此,如果您可以在现有的std::vector
代码旁边包含您的std::unordered_set
解决方案,这可能有助于澄清事情。 - Christian Rau