Maison  >  Article  >  développement back-end  >  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
Linda Hamiltonoriginal
2024-11-01 14:50:02739parcourir

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

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!

Déclaration:
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