Maison > développement back-end > C++ > Pourquoi l'itération sur « std :: vector » est-elle plus rapide que « std :: array » dans ce benchmark ?

Pourquoi l'itération sur « std :: vector » est-elle plus rapide que « std :: array » dans ce benchmark ?

Linda Hamilton
Libérer: 2024-11-01 14:50:02
original
827 Les gens l'ont consulté

Why is Iterating through `std::vector` Faster than `std::array` in This Benchmark?

La perplexité des performances itératives : std::array vs. std::vector

Dans une enquête précédente, il a été découvert que l'itération à travers un std :: array était sensiblement plus rapide que l'itération à travers un std :: vector. Pour rectifier ces observations erronées, un nouveau benchmark a été conçu, révélant un renversement surprenant : l'itération sur std::vector était désormais beaucoup plus rapide.

Pour éviter des optimisations potentielles, le résultat de la boucle a été inclus, et le - L'indicateur O3 a été activé. De plus, std::chrono a été utilisé pour un timing précis, isolant l'exécution de la boucle.

Les résultats étaient frappants :

std::array:

$ ./a.out
result: 0
time: 99.554109
Copier après la connexion

std::vector:

$ g++ arrVsVec.cpp -O3
$ ./a.out
result: 0
time: 30.734491
Copier après la connexion

Révéler le mystère

En examinant le démontage à Godbolt, il est devenu Il est évident que l'écart de performances provenait de la résidence des pages mémoire dans l'espace d'adressage du processus. Alors que le std::vector avait déjà été alloué et rempli de zéros, le std::array était stocké dans la section globale .bss de l'exécutable et ses pages n'avaient pas été paginées.

Résolution le problème

Pour résoudre cet écart, il est nécessaire d'amener les pages std::array dans l'espace d'adressage. Ceci peut être réalisé en ajoutant la ligne suivante au début de la fonction principale :

std::fill_n(v.data(), n, 1); // included in <algorithm>
Copier après la connexion

ou bien, sous Linux, en utilisant mlock() :

mlock(v.data(), v.size() * sizeof(v[0]));
Copier après la connexion

Conclusion

Ce benchmark met en évidence l'importance de la résidence des pages dans la performance de l'itération. En garantissant que les pages de std::array et std::vector sont présentes dans l'espace d'adressage, les performances d'itération peuvent être considérablement améliorées.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal