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