78 votes

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

Le nom de l'option indique quelque chose, mais que font réellement Visual Studio / le 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 réellement. Par exemple, pourquoi les boucles ont-elles moins de temps, etc.

64voto

Suma Points 11966

Sans optimisations du compilateur produit très bête de code - chaque commande est compilé dans un très simple, de sorte qu'elle ne les entendait chose. Les versions de Débogage ont optimisations désactivé par défaut, parce que sans les optimisations de l'exécutable produit correspond au code source de façon simple.

Les Variables conservées dans les registres

Une fois que vous mettez sur les optimisations, le compilateur s'applique beaucoup de différentes techniques pour rendre le code en cours d'exécution plus rapide tout en faisant la même chose. La différence la plus évidente entre optimisé et unoptimized construit dans Visual C++ est le fait que les valeurs de la variable sont conservés dans des registres aussi longtemps que possible dans optimisé construit, alors que sans optimisations qu'ils sont toujours stockées dans la mémoire. Cela affecte non seulement le code de vitesse, mais il affecte également le débogage. Comme un résultat de cette optimisation, le débogueur ne peut pas obtenir de manière fiable la valeur d'une variable que vous avancerez dans le code.

D'autres optimisations

Il existe de nombreuses autres optimisations appliquées par le compilateur, comme décrit dans l' /O Options (Optimiser le Code) MSDN docs. Pour une description générale des différentes optimisations techniques voir Wikipédia Optimisation du Compilateur article.

18voto

REVA Points 766

De Paul Vick blog:

  • Il enlève toute NOP instructions que nous aurions autrement émettent pour aider au débogage. Lors de l'optimisation off (et les informations de débogage est activé), le compilateur émet NOP instructions pour les lignes qui n'ont pas de réelle IL associé avec eux, mais vous souhaiterez peut-être mettre un point d'arrêt. L'exemple le plus courant de quelque chose comme ce serait le "End if" de l'instruction "if" - il n'y a pas de réelle IL émise pour une Fin Si, donc, nous ne pouvons pas émettre une NOP le débogueur ne vous laisse pas définir un point d'arrêt sur elle. Tournant sur des optimisations force le compilateur de ne pas émettre de l'Opr.

  • Nous faisons un simple bloc de base de l'analyse de l'généré IL supprimer toutes les morts des blocs de code. C'est, nous rompons à part chaque méthode dans des blocs de IL séparées par des instructions de branchement. En faisant une rapide analyse de la façon dont les blocs sont en corrélation, nous pouvons identifier tous les blocs qui n'ont pas de branches. Ainsi, nous pouvons trouver des blocs de code qui ne sera jamais exécutée et peut être omis, pour donner à l'ensemble légèrement plus petit. Nous faisons aussi les mineurs de la branche des optimisations à ce point - par exemple, si vous avez un autre GoTo GoTo, nous venons d'optimiser la première GoTo pour passer à la deuxième GoTo cible.

  • Nous émettons un DebuggableAttribute avec IsJITOptimizerDisabled définie sur False. En gros, cela permet de run-time, JIT pour optimiser le code de la façon dont il l'entend, y compris la réorganisation et de l'in-lining code. Cela produira plus efficace et le plus petit code, mais cela signifie que d'essayer de déboguer le code peut être très difficile (comme toute personne qui a essayé, il va vous le dire). La liste réelle de ce que le JIT optimisations sont est quelque chose que je ne sais pas - peut-être quelqu'un comme Chris Brumme sonne à la sur cette. Le long et le court, c'est que l'optimisation de l'interrupteur permet des optimisations qui pourraient faire de définition de points d'arrêt et d'intégrer votre code plus difficile.

2voto

JesperE Points 34356

La réponse courte est: utilisez -Bœuf et laisser le compilateur faire son travail.

La réponse longue: l'effet de différents types d'optimisations est impossible de prédire avec exactitude. Parfois, l'optimisation de la vitesse du code sera réellement le rendement plus petit que le code lors de l'optimisation de la taille. Si vous voulez vraiment obtenir la dernière 0,01% de rendement (speedwise ou sizewise), vous avez à comparer les différentes combinaisons d'options.

Aussi, les dernières versions de Visual Studio ont des options pour plus d'optimisations avancées telles que la liaison à l'optimisation du temps et du profil de l'optimisation orientée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X