Ce n' “Optimiser” Code de l'option de réellement faire dans Visual Studio?
Nom de l'option dit quelque chose, mais ce que Visual Studio/compilateur vraiment le faire et quelles sont les conséquences réelles?
Edit: Si vous effectuez une recherche google vous pouvez trouver cette adresse, mais ce n'est pas vraiment que je suis à la recherche d'. Je me demande les choses réelles qui se passe. Par exemple, pourquoi ne les boucles sont de moins en moins de temps, etc.
Vous devez vous connecter pour publier un commentaire.
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.
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 à exécuter plus rapidement si elle est encore en train de faire 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 /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.
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 sur. 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 faire 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 en eux. 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.
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.