Maison  >  Article  >  développement back-end  >  Pourquoi parcourir `std::vector` est-il plus rapide que `std::array` ?

Pourquoi parcourir `std::vector` est-il plus rapide que `std::array` ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 17:18:31754parcourir

Why is iterating through `std::vector` faster than `std::array`?

Revers de fortune : itérer via std::vector surpasse std::array

Contrairement à l'hypothèse initiale, un benchmark récent a révélé que parcourir un std :: vector est nettement plus rapide que parcourir un std :: array. Cela contredit la croyance précédente selon laquelle les tableaux offraient des performances d'itération supérieures.

Pour garantir l'exactitude, le benchmark a utilisé plusieurs améliorations :

  • Application de la consommation des résultats : Un non- Une boucle triviale a été utilisée pour empêcher l'optimisation du compilateur d'éliminer la boucle.
  • Utilisation de l'optimisation -O3 : Le code a été compilé avec le niveau d'optimisation le plus élevé pour maximiser les performances.
  • Mesure de la boucle d'isolement : std::chrono a été utilisé pour mesurer uniquement le temps d'itération, à l'exclusion de l'initialisation des variables.

Les temps mesurés pour std::array et std::vector étaient les suivants suit :

std::array: 99.554109 milliseconds
std::vector: 30.734491 milliseconds

Explorer la cause

L'avantage surprenant en termes de vitesse de std::vector peut être attribué à la pagination de la mémoire. Le tableau, qui est stocké dans la portée globale, réside initialement dans la section .bss de l'exécutable et n'est pas paginé dans l'espace d'adressage du processus. En revanche, le std::vector est alloué et rempli de zéros lors de sa création, ce qui entraîne la présence de ses pages mémoire en mémoire.

Résoudre le problème

À Pour uniformiser les règles du jeu, on peut initialiser explicitement le tableau ou mettre ses pages en mémoire avant l'itération. Voici une modification qui rend le temps d'itération du tableau comparable à celui du std::vector:

<code class="cpp">std::fill_n(v.data(), n, 1);</code>

Alternativement, la fonction mlock() peut être utilisée pour forcer les pages du tableau en mémoire sur les systèmes Linux.

Cet ajustement démontre que la différence de performances entre std::array et std::vector provient principalement de leurs stratégies de gestion de la mémoire, soulignant l'importance des modèles d'accès à la mémoire dans les performances du programme.

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