Résumé du problème
Les performances d'un benchmark popcount variaient considérablement lorsque la variable du compteur de boucles passait de 32 bits non signés à 64 bits non signés, bien que le changement ne semble pas affecter le fonctionnement de base de la boucle.
Question
Réponse
1. La différence de performances est due à une fausse dépendance de données dans l'instruction popcnt sur les processeurs Intel.
Lorsque le compteur de boucle est de 32 bits, les instructions popcnt de chaque itération de boucle sont exécutées indépendamment, ce qui permet un fonctionnement parallèle exécution. Cependant, lorsque le compteur de boucles est de 64 bits, une fausse dépendance de données est introduite entre les instructions popcnt, rendant impossible leur exécution en parallèle. Cette dépendance est causée par la réutilisation du registre de destination de l'instruction popcnt pour l'itération suivante, créant une dépendance artificielle qui limite les performances.
2. Remplacer une taille de tampon non constante par une valeur constante peut ralentir le code car cela empêche le compilateur d'effectuer certaines optimisations.
Avec une taille de tampon constante, le compilateur connaît la taille exacte du tampon au moment de la compilation, ce qui peut permettre des modèles d'accès à la mémoire et une planification des instructions plus efficaces. Cependant, avec une taille de tampon non constante, le compilateur doit assumer le pire des cas, ce qui peut conduire à un code moins optimisé.
3. L'ajout du mot-clé 'static' à la variable de taille du tampon rend la boucle 64 bits plus rapide car cela fait de la taille du tampon une constante au moment de la compilation, permettant au compilateur d'effectuer des optimisations supplémentaires.
En faisant le la taille du tampon est une constante au moment de la compilation, le compilateur peut optimiser de manière plus agressive les modèles d'accès à la mémoire et la planification des instructions, ce qui entraîne un code plus rapide.
Leçons Appris
Même de petits changements dans une boucle peuvent avoir un impact significatif sur les performances en raison de dépendances inattendues ou d'optimisations du compilateur. Il est important de comprendre ces dépendances et comment elles affectent les performances pour écrire du code efficace.
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!