Maison > Article > développement back-end > Pourquoi l'itération sur « std :: vector » est-elle plus rapide que « std :: array » dans ce 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
std::vector:
$ g++ arrVsVec.cpp -O3 $ ./a.out result: 0 time: 30.734491
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>
ou bien, sous Linux, en utilisant mlock() :
mlock(v.data(), v.size() * sizeof(v[0]));
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!