Maison  >  Article  >  développement back-end  >  Pourquoi l'itération sur std :: vector est-elle plus rapide que std :: array dans mon benchmark ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 03:19:02183parcourir

Why is iterating through std::vector faster than std::array in my benchmark?

Pourquoi itérer via std::vector est plus rapide que itérer via std::array

Dans un benchmark précédent, il était supposé que l'itération via std :: array serait plus rapide que d'itérer via std :: vector. Cependant, les révisions ultérieures du benchmark ont ​​révélé que std::vector était en fait l'option la plus rapide. Cet article examine les raisons de cette découverte inattendue.

Améliorations du benchmark

Le benchmark amélioré corrige les défauts suivants dans la mise en œuvre originale :

  • Assurer que le résultat de la boucle est utilisé pour éviter les omissions d'optimisation.
  • Utiliser l'indicateur -O3 pour la vitesse améliorations.
  • Utilisation de std::chrono pour isoler la mesure dans la boucle for uniquement.

Résultats de référence

Les timings de référence résultants a démontré que, contrairement à l'hypothèse précédente :

  • std::array : Execution time = 99,554109 millisecondes
  • std::vector : Temps d'exécution = 30,734491 millisecondes

Analyse

La différence de performances observée provient de la gestion de la mémoire différences entre std :: array et std :: vector. Dans le cas de std::array, le tableau de portée globale est initialement stocké dans la section .bss de l'exécutable, qui réside dans la mémoire non paginée. Par conséquent, lorsque le std::array est accédé pour la première fois, les pages mémoire sont défectueuses, ce qui entraîne une surcharge de performances.

En revanche, std::vector alloue et remplit à zéro ses pages mémoire lors création. Cela garantit que les pages sont déjà présentes en mémoire lorsque la boucle parcourt le vecteur.

Pour illustrer ce concept, une ligne de code a été ajoutée au début de la fonction main pour amener les pages mémoire de std ::array dans l'espace d'adressage :

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

En préconfigurant les pages, le temps d'exécution de std::array est réduit pour correspondre à celui de std::vector.

Conclusion

La différence de performances entre l'itération via std::array et std::vector provient des mécanismes de gestion de la mémoire. Pré-défauter les pages std::array ou exécuter le programme sur un système d'exploitation prenant en charge mlock peut améliorer les performances de std::array pour correspondre à celles de std::vector.

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