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 :
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 :
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!