web-dev-qa-db-fra.com

Que fait vraiment l'option "Optimiser le code" dans Visual Studio?

Le nom de l'option indique quelque chose mais que font vraiment Visual Studio/compilateur et quelles sont les conséquences réelles?

Edit: Si vous recherchez sur Google, vous pouvez trouver cette adresse , mais ce n'est pas vraiment ce que je recherche. Je me demande ce qui se passe vraiment. Par exemple, pourquoi les boucles gagnent-elles moins de temps, etc.

72
spinodal

Sans optimisations, le compilateur produit du code très stupide - chaque commande est compilée de manière très simple, de sorte qu'elle fait ce qui est prévu. Les versions de débogage ont des optimisations désactivées par défaut, car sans les optimisations, l'exécutable produit correspond au code source de manière simple.

Variables conservées dans les registres

Une fois que vous avez activé les optimisations, le compilateur applique de nombreuses techniques différentes pour accélérer l'exécution du code tout en faisant la même chose. La différence la plus évidente entre les versions optimisées et non optimisées dans Visual C++ est le fait que les valeurs des variables sont conservées dans les registres aussi longtemps que possible dans les versions optimisées, tandis que sans optimisations, elles sont toujours stockées dans la mémoire. Cela affecte non seulement la vitesse du code, mais également le débogage. À la suite de cette optimisation, le débogueur ne peut pas obtenir de manière fiable une valeur de variable lorsque vous parcourez le code.

Autres optimisations

Il existe plusieurs autres optimisations appliquées par le compilateur, comme décrit dans / O Options (Optimiser le code) MSDN docs . Pour une description générale des diverses techniques d'optimisation, voir article sur l'optimisation du compilateur Wikipedia .

59
Suma

De Paul Vick's blog:

  • Il supprime toutes les instructions NOP que nous aurions autrement émises pour aider au débogage. Lorsque les optimisations sont désactivées (et que les informations de débogage sont activées), le compilateur émet des instructions NOP pour les lignes qui ne sont associées à aucun IL mais que vous souhaiterez peut-être ajouter un point d'arrêt. L'exemple le plus courant de quelque chose comme ça serait le "End If" d'une instruction "If" - il n'y a pas d'IL réel émis pour un End If, donc nous n'émettons pas de NOP, le débogueur ne vous laissera pas définir un point d'arrêt dessus. L'activation des optimisations force le compilateur à ne pas émettre les NOP.

  • Nous effectuons une simple analyse de bloc de base de l'IL généré pour supprimer tout bloc de code mort. Autrement dit, nous séparons chaque méthode en blocs d'IL séparés par des instructions de branchement. En faisant une analyse rapide de la façon dont les blocs interagissent, nous pouvons identifier tous les blocs qui n'ont pas de branches en eux. Ainsi, nous pouvons comprendre des blocs de code qui ne seront jamais exécutés et peuvent être omis, ce qui rend l'assemblage légèrement plus petit. Nous faisons également quelques optimisations de branche mineures à ce stade également - par exemple, si vous allez à une autre instruction GoTo, nous optimisons simplement le premier GoTo pour passer à la cible du second GoTo.

  • Nous émettons un DebuggableAttribute avec IsJITOptimizerDisabled défini sur False. Fondamentalement, cela permet au JIT au moment de l'exécution d'optimiser le code comme bon lui semble, y compris la réorganisation et l'inline du code. Cela produira un code plus efficace et plus petit, mais cela signifie que tenter de déboguer le code peut être très difficile (comme vous le dira toute personne qui l'a essayé). La liste réelle des optimisations JIT est quelque chose que je ne sais pas - peut-être que quelqu'un comme Chris Brumme interviendra à un moment donné à ce sujet. Le long et le court de celui-ci est que le commutateur d'optimisation permet des optimisations qui pourraient rendre plus difficile la définition de points d'arrêt et la progression dans votre code.

16
reva

La réponse courte est: utilisez -Ox et laissez le compilateur faire son travail.

La réponse longue: l'effet de différents types d'optimisations est impossible à prévoir avec précision. Parfois, l'optimisation du code rapide produit en fait un code plus petit que lors de l'optimisation de la taille. Si vous voulez vraiment obtenir les derniers 0,01% de performances (en vitesse ou en taille), vous devez comparer différentes combinaisons d'options.

En outre, les versions récentes de Visual Studio ont des options pour des optimisations plus avancées telles que l'optimisation du temps de liaison et l'optimisation guidée par profil.

2
JesperE