Maison >développement back-end >C++ >`std::vector` est-il vraiment plus lent que les tableaux natifs ?
Std::vector est-il significativement plus lent que les tableaux natifs ?
Vous avez peut-être entendu dire que std::vector est essentiellement implémenté comme un tableau, ce qui implique que leurs performances doivent être comparables. Cependant, vos tests récents suggèrent le contraire, std::vector présentant une pénalité de performances significative. Cet article vise à clarifier si std::vector est effectivement beaucoup plus lent que les tableaux natifs.
Analyse des performances
Le code de test fourni mesure le temps nécessaire pour initialiser un grand tableau d'objets Pixel utilisant trois méthodes différentes : std::vector avec resize(), std::vector avec push_back() et un tableau simple alloué avec malloc(). Les résultats indiquent que std::vector avec resize() est environ 4 fois plus lent qu'un tableau simple, tandis que std::vector avec push_back() est encore plus lent.
Cependant, après un examen plus approfondi, cela devient évident que la différence de performances provient du fait que le code de test parcourt deux fois le vecteur. La première itération initialise les objets et la deuxième itération les lit simplement. Ceci est fait pour faciliter une comparaison équitable avec le tableau simple, qui ne peut être initialisé qu'une seule fois.
Test révisé
Pour comparer avec précision les performances de std :: vector aux tableaux natifs, le code de test a été modifié pour initialiser le vecteur une seule fois :
std::vector<Pixel> pixels(dimensions * dimensions, Pixel(255, 0, 0));
Avec cette modification, l'écart de performances entre std::vector et un Le tableau simple est devenu négligeable :
g++ -O3 Time.cpp -I <MyBoost> ./a.out UseVector completed in 2.216 seconds
Conclusion
Sur la base des résultats des tests révisés, les performances de std::vector sont comparables à celles des tableaux natifs. La lenteur apparente observée lors des premiers tests était due à la méthode d'initialisation inefficace utilisée pour std::vector. Lorsqu'il est initialisé correctement, std::vector présente une surcharge de performances minimale par rapport aux tableaux natifs.
Il convient de noter que les résultats des tests présentés sont spécifiques à la classe Pixel et aux modèles d'initialisation particuliers utilisés. Les performances peuvent varier pour d'autres classes et scénarios d'initialisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!