292 votes

Les différences de performances entre debug et release s’appuie

je dois admettre, que d'habitude je n'ai pas pris la peine swithcing entre Debug et Release configurations dans mon programme, et j'ai généralement choisi d'aller pour la configuration Debug, même lorsque les programmes sont effectivement déployées chez les clients.

Autant que je sache, la seule différence entre ces configurations si vous ne modifiez pas manuellement est que le Débogage ont le DÉBOGAGE constante définie, et la Libération ont le Optimiser le code vérifié.

Donc ma questions est en fait double:

1) existe-il beaucoup de différences de performances entre ces deux configurations. Il n'existe aucun type spécifique de code qui entraîne de grandes différences dans les performances ici, ou est-elle pas si important que cela?

2) existe-t-il un type de code qui sera exécuté amende en vertu de la configuration de Débogage qui peuvent échouer en vertu de la configuration de Version, ou pouvez-vous être certain que le code qui est testé et fonctionne bien en vertu de la configuration Debug fonctionne également très bien en vertu de la Libération de configuration.

533voto

Hans Passant Points 475940

Le compilateur C# lui-même ne modifie pas le émise IL beaucoup dans la version Release. Notable est qu'il ne diffuse plus le NOP opcodes qui vous permettent de définir un point d'arrêt sur une accolade. Le grand est à l'optimiseur qui est intégrée dans le compilateur JIT. Je sais que ça fait les optimisations suivantes:

  • Méthode inline. Un appel de méthode est remplacé par l'injection du code de la méthode. C'est grand, il fait accesseurs de propriété essentiellement gratuit.

  • PROCESSEUR d'allocation de registres. Les variables locales et les arguments de méthode peut rester stocké dans un PROCESSEUR inscrire sans jamais (ou moins souvent) d'être stockés sur le frame de pile. C'est un gros, notables pour faire le débogage de code optimisé si difficile. Et de donner le volatile mot un sens.

  • Index de tableau de vérification de l'élimination. Une importante optimisation lorsque l'on travaille avec des tableaux (de tous .Collecte NETTE des classes de l'utilisation d'un tableau à l'interne). Lorsque le compilateur JIT peut vérifier qu'une boucle ne jamais les indices d'un tableau en dehors des limites ensuite, il permettra d'éliminer l'indice de la case. Big one.

  • Déroulement de la boucle. Boucles courtes (jusqu'à 4) avec les petits organismes sont éliminés en répétant le code dans le corps de la boucle. Évite les erreurs de prédiction de la direction générale de la peine.

  • L'élimination du code mort. Une instruction if (false) { /.../ } obtient complètement éliminé. Cela peut se produire en raison de constantes et inline. D'autres cas où le compilateur JIT peut déterminer que le code n'a pas de possibles effets secondaires. Cette optimisation est ce qui rend le profilage de code si délicate.

  • Code de levage. Code à l'intérieur d'une boucle qui n'est pas affecté par la boucle peut être déplacé hors de la boucle.

  • Commune de la sous-expression de l'élimination. x = y + 4; z = y + 4; devient z = x;

  • De constantes. x = 1 + 2; devient x = 3; Ce simple exemple est pris tôt par le compilateur, mais il arrive à temps JIT, quand d'autres optimisations de rendre cela possible.

  • Copie de propagation. x = a; y = x; devient y = a; Cela permet à l'allocateur de registres de prendre de meilleures décisions. C'est un gros problème dans le x86 gigue parce qu'il a si peu de registres de travailler avec. Avoir de sélectionner les plus appropriés est essentiel pour la perf.

Elles sont très importantes optimisations qui peuvent faire une grande différence lorsque, par exemple, vous le profil de la version de Débogage de votre application et de le comparer à la Version de publication. Que seul importe vraiment bien que lorsque le code est sur votre chemin critique, de 5 à 10% de la code que vous écrivez qu' en réalité affecte la perf de votre programme. L'équipe de l'optimiseur n'est pas assez intelligent pour savoir à l'avance ce qui est crucial, il ne peut appliquer que le "tourner à onze" l'accès pour tous le code.

Le résultat de ces optimisations sur votre programme du temps d'exécution est souvent affectée par le code qui fonctionne ailleurs. La lecture d'un fichier, l'exécution d'une requête de dbase, etc. Faire le travail de l'équipe optimizer n'est complètement invisible. Il n'a pas l'esprit bien :)

L'équipe de l'optimiseur est assez fiable des codes, principalement parce qu'il a été mis à l'épreuve des millions de fois. Il est extrêmement rare d'avoir des problèmes dans la version Release de la version de votre programme. Il arrive cependant. À la fois le x64 et x86 frousse ont eu des problèmes avec des structures. Le x86 gigue a de la difficulté à virgule flottante de la cohérence, de la production subtilement des résultats différents lorsque les intermédiaires de virgule flottante de calcul sont conservés dans un FPU s'inscrire à 80 bits de précision au lieu de se tronquée vidés de la mémoire.

23voto

Pieter van Ginkel Points 17057
  1. Oui, il y a beaucoup de différences de performances et ces vraiment s'appliquer partout dans votre code. Debug ne fait que très peu d'optimisation de la performance, et le mode de diffusion très bien;

  2. Seul le code qui s'appuie sur l' DEBUG constante fonctionnent différemment avec une version release. En outre, vous ne devriez pas voir les problèmes.

Un exemple de code de la structure qui dépend de l' DEBUG constante, c'est l' Debug.Assert() méthode, qui a l'attribut [Conditional("DEBUG)"] défini. Cela signifie qu'il dépend aussi de l' DEBUG constante et ce n'est pas inclus dans la version de publication.

14voto

Lie Ryan Points 24517

Cela dépend fortement de la nature de votre demande. Si votre application est l'INTERFACE utilisateur-lourds, vous avez probablement ne remarquerez aucune différence puisque le composant le plus lent connecté à un ordinateur moderne est l'utilisateur. Si vous utilisez une INTERFACE utilisateur animations, vous pouvez tester si vous pouvez percevoir notable de latence lors de l'exécution dans la version DEBUG.

Toutefois, si vous avez beaucoup de calcul-lourds calculs, alors vous remarquerez des différences (qui pourrait être aussi élevé que 40% @Pieter évoqué, mais cela dépend de la nature des calculs).

Il s'agit essentiellement d'une conception de compromis. Si vous sortez en vertu de la version DEBUG, puis si l'utilisateur rencontre des problèmes, vous pouvez obtenir un plus significatif assurer la traçabilité et vous pouvez faire beaucoup plus flexible de diagnostic. En libérant dans la version de DÉBOGAGE, vous pouvez également éviter l'optimiseur de production obscur Heisenbugs.

12voto

Dan Bryant Points 19021
  • Mon expérience a montré que les applications de taille moyenne ou plus grandes sont sensiblement plus réactives dans une version Release. Essayez-le avec votre application et voyez comment cela se sent.

  • Une chose qui peut vous mordre avec les builds Release est que le code de build Debug peut parfois supprimer les conditions de course et d'autres bugs liés au threading. Un code optimisé peut entraîner une réorganisation de l'instruction et une exécution plus rapide peut exacerber certaines conditions de course.

10voto

Jason Kresowaty Points 8053

Vous ne devriez jamais sortir une .NET Debug dans la production. Il peut contenir laid code à l'appui de Modifier et Continuer ou qui sait quoi d'autre. Autant que je sache, cela n'arrive que dans VB C# (note: le post original est marqué, C#), mais il devrait encore donner raison à la pause à ce que Microsoft pense qu'ils sont autorisés à faire une version de Débogage. En fait, avant .NET 4.0, visual basic code des fuites de mémoire proportionnelle au nombre d'instances d'objets avec les événements que vous créez à l'appui de Modifier et Continuer. (Même si cela est signalé à être fixé par https://connect.microsoft.com/VisualStudio/feedback/details/481671/vb-classes-with-events-are-not-garbage-collected-when-debuggingle code généré ressemble méchants, la création d' WeakReference des objets et en les ajoutant à une liste statique alors que le maintien d'un verrou) certes, je ne veux pas de ce genre de support de débogage dans un environnement de production!

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