Dans mon moteur physique personnalisé, le plus gros goulot d'étranglement est une méthode qui récupère tous les corps du partitionnement spatial (une grille 2D) et renvoie une collection contenant uniquement des pointeurs uniques vers le corps. L'utilisation d'un profileur montre que le goulot d'étranglement est dans la méthode "contains".std :: vecteur plus rapide que std :: unordered_set?
De toute évidence, un std::unordered_set
serait la solution "idéale" ici. Cependant, il est beaucoup plus lent que la solution actuelle. J'ai également essayé google::dense_hash_set
, qui est plus rapide que std::unordered_set
, mais toujours plus lent que la solution actuelle.
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;
}
Pourquoi les conteneurs "corrects" plus lent qu'un std::vector
?
Y a-t-il un moyen d'accélérer cette méthode?
Les résultats de profilage sont-ils uniquement pour 'contains'? Rappelez-vous que la recherche peut être plus rapide mais que l'insertion est plus lente que le vecteur. –
Je suppose que vous n'avez pas fait une telle erreur, mais juste pour être vraiment vraiment sûr, vous n'avez pas utilisé 'std :: find' quand vous avez essayé le' std :: unordered_map', n'est-ce pas? –
@stardust_ Le profileur affiche la méthode "getBodiesToCheck()" comme goulot d'étranglement. Si j'utilise la version std :: vector, le goulot d'étranglement à l'intérieur de getBodiesToCheck() (goulot d'étranglement du goulot d'étranglement: P) est l'appel à "contient" –