2010-08-06 4 views
12

Quel gain de performance (le cas échéant) un service Windows peut-il gagner entre une version de débogage et une version de build et pourquoi?C# Debug vs Release

+0

Ceci est une grande question qui pourrait être bien servi par des mesures de référence, si quelqu'un peut leur fournir. – kbrimington

+0

duplication possible de [débogage C# vs performances de libération] (http://stackoverflow.com/questions/2446027/c-debug-vs-release-performance) –

Répondre

6

Pour le code managé, sauf si vous avez beaucoup de choses dans certaines conditions compilé pour debug il devrait y avoir peu de différence - l'IL devrait être à peu près la même chose. Le Jitter génère différemment lorsqu'il est exécuté sous le débogueur ou non - la compilation vers IL n'est pas beaucoup affectée.

Il y a certaines choses que l'/optimize lors de la compilation à ne IL, mais ils ne sont pas particulièrement agressifs. Et certaines de ces optimisations IL seront probablement gérées par les optimisations de gigue, même si elles ne sont pas optimisées dans l'IL (comme la suppression de Nops).

Voir Eric article Lippert http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx pour plus de détails:

Le/optimize drapeau ne change pas une quantité énorme de notre émission et la logique de génération. Nous essayons toujours de générer un code simple et vérifiable, puis de compter sur la gigue pour effectuer la lourde levée des optimisations lors de la génération du code machine réel. Mais nous allons faire quelques optimisations simples avec cet ensemble de drapeaux.

Lire l'article d'Eric pour plus d'informations sur /optimize fait différemment dans la génération IL.

+0

Bonnes choses ... qu'en est-il de la sécurité? Si vous expédiez/exposez avec des informations de débogage, une inspection en révélera-t-elle davantage sur votre code? Même s'il y a une différence négligeable dans les performances, je ne livrerais pas de code de débogage à moins que je ne devais le faire. –

+1

@Edward: Je ne préconise pas vraiment la distribution de builds DEBUG, juste en disant que vous ne devriez probablement pas vous attendre à une différence majeure de performance entre les builds DEBUG et RELEASE.En outre, je ne pense pas qu'une build DEBUG ait plus de détails dans l'assembly lui-même - les informations de débogage vont dans le fichier .pdb, que vous n'avez pas besoin de distribuer. Les assemblys .NET sont généralement assez facilement désassemblés/décompilés (voir l'outil Réflecteur). Si vous êtes préoccupé par la rétro-ingénierie, il existe des outils d'obfuscation pour vous aider, mais je ne sais pas vraiment quoi que ce soit à leur sujet. –

+1

Merci ... J'ai oublié le .pdb ayant les informations de débogage. Beaucoup d'outils d'obfuscation ne sont pas complets et potentiellement coûteux. Je suppose toujours que si quelqu'un veut vraiment entrer, il va entrer. Je devrais passer plus de temps à innover et moins de temps à me protéger. –

1

Eh bien, si la question est un double, je pense que certaines des meilleures réponses à la question initiale sont au bas. Personnellement, j'ai vu des situations où il y a une différence appréciable entre les modes de débogage et de relâchement. (Exemple: Property performance, où il y avait une différence de 2x entre l'accès aux propriétés en mode debug et release). Si cette différence serait présente dans un logiciel réel (au lieu de programme de référence) est discutable, mais je l'ai vu se produire dans un produit sur lequel j'ai travaillé.

De la réponse de Neil sur la question d'origine, de msdn social:

Il est pas bien documenté, voici ce que je sais. Le compilateur émet une instance de System.Diagnostics.DebuggableAttribute. Dans la version de débogage, la propriété IsJitOptimizerEnabled a la valeur True, dans la version de version, elle est False. Vous pouvez voir cet attribut dans le manifeste d'assembly avec ildasm.exe.

Le compilateur JIT utilise cet attribut pour désactiver les optimisations qui rendraient le débogage difficile. Ceux qui se déplacent autour du code comme le levage en boucle invariante. Dans certains cas, cela peut faire une grande différence dans les performances. Pas habituellement cependant.

Le mappage des points d'arrêt aux adresses d'exécution est le travail du débogueur. Il utilise le fichier .pdb et les informations générées par le compilateur JIT qui fournit l'instruction IL au mappage d'adresse de code. Si vous écrivez votre propre débogueur, vous utiliserez ICorDebugCode :: GetILToNativeMapping().

Questions connexes