Maison >développement back-end >C++ >Pourquoi ma boucle est-elle lente lors du traitement de 8192 éléments ?
Pourquoi les performances chutent lors d'une boucle sur 8192 éléments
Lors d'une boucle sur 8192 éléments, le programme rencontre un ralentissement significatif. Ceci est attribué à un problème d'alignement de la mémoire, exacerbé par une structure de boucle inefficace.
Alignement de la mémoire
Les processeurs modernes utilisent des hiérarchies de cache pour améliorer la vitesse d'accès aux données. Les accès mémoire alignés, où les données sont stockées à des adresses multiples de la taille de la ligne de cache, permettent une récupération plus rapide des données. Cependant, dans ce cas, le paramètre SIZE est défini sur 8192, ce qui n'est pas un multiple de la taille de la ligne de cache (généralement 64 octets). Ce désalignement peut ralentir les opérations d'accès à la mémoire.
Ordre des boucles
Le problème d'alignement de la mémoire est aggravé par l'ordre des boucles. Le code d'origine parcourt la matrice par colonnes, ce qui entraîne des accès mémoire non séquentiels. Cela oblige le processeur à effectuer des récupérations plus lentes et aléatoires des données de la mémoire.
Solution
Il existe deux solutions possibles :
En interchangeant l'ordre des boucles dans le code, le goulot d'étranglement des performances est éliminé.
Exemple
Le code suivant illustre le correctif :
for(j=1;j<SIZE-1;j++) { for(i=1;i<SIZE-1;i++) { res[j][i]=0; res[j][i] += img[j-1][i-1]; ... } }
Comparaison des performances
Après l'application du correctif, les performances s'améliorent considérablement :
Code d'origine :
SIZE = 8191: 1.499 seconds SIZE = 8192: 2.122 seconds SIZE = 8193: 1.582 seconds
Code fixe :
SIZE = 8191: 0.376 seconds SIZE = 8192: 0.357 seconds SIZE = 8193: 0.351 seconds
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!