2010-08-06 24 views
12

¿Cuánta ganancia de rendimiento (si hay alguna) puede obtener un servicio de Windows entre una versión de depuración y una versión de lanzamiento y por qué?C# Debug vs Release

+0

Esta es una gran pregunta que podrían ser bien atendidas por algunas métricas de referencia, si alguien puede proporcionarlas. – kbrimington

+0

posible duplicado de [C# depuración frente a versión de rendimiento] (http://stackoverflow.com/questions/2446027/c-debug-vs-release-performance) –

Respuesta

6

Para el código administrado, a menos que tenga muchas cosas compiladas condicionalmente para las compilaciones DEBUG, debería haber poca diferencia: la IL debería ser prácticamente la misma. El Jitter se genera de manera diferente cuando se ejecuta bajo el depurador o no; la compilación a IL no se ve afectada demasiado.

Hay algunas cosas que hace /optimize al compilar en IL, pero no son particularmente agresivas. Y algunas de esas optimizaciones IL probablemente serán manejadas por las optimizaciones de jitter, incluso si no están optimizadas en la IL (como la eliminación de nops).

Ver el artículo de Eric Lippert http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx para más detalles:

La bandera/Optimizar no cambia una cantidad enorme de nuestra emisora ​​y lógica de generación. Siempre tratamos de generar código directo y verificable y luego confiar en la trepidación para realizar el levantamiento pesado de optimizaciones cuando genera el código de máquina real. Pero haremos algunas optimizaciones simples con ese conjunto de banderas.

Lea el artículo de Eric para obtener información acerca de /optimize hace de manera diferente en la generación IL.

+0

Cosas buenas ... ¿qué pasa con la seguridad? Si envía/expone con información de depuración, ¿una inspección revelará más sobre su código? Incluso si hay una diferencia insignificante en el rendimiento, no enviaría el código de depuración a menos que tuviera que hacerlo. –

+1

@Edward: realmente no estoy abogando por la distribución de compilaciones DEBUG, simplemente diciendo que probablemente no se debe esperar una gran diferencia en el rendimiento entre las compilaciones DEBUG y RELEASE.Además, no creo que una compilación DEBUG tenga más detalles en el ensamblado en sí: la información de depuración va en el archivo .pdb, que no necesita distribuir. Los ensamblados .NET generalmente se desmontan/decompilan con facilidad (consulte la herramienta Reflector). Si le preocupa la ingeniería inversa, existen herramientas de ofuscación para ayudarlo, pero realmente no sé nada al respecto. –

+1

Gracias ... Olvidé que el .pdb tenía la información de depuración. Muchas herramientas de ofuscación no son a prueba completa y potencialmente costosas. Siempre asumo que si alguien realmente quiere, entrarán. Debo dedicar más tiempo a innovar y menos a proteger mi tiempo. –

1

Bueno, aunque la pregunta es un duplicado, creo que algunas de las mejores respuestas en la pregunta original están en la parte inferior. Personalmente, he visto situaciones en las que existe una diferencia apreciable entre los modos de depuración y liberación. (Ejemplo: Property performance, donde había una diferencia de 2x entre el acceso a las propiedades en modo de depuración y versión). Si esta diferencia estaría presente en un software real (en lugar de un programa de referencia) es discutible, pero lo he visto en un producto en el que trabajé.

De la respuesta de Neil en la pregunta original, desde msdn social:

No está bien documentado, esto es lo que sé. El compilador emite una instancia de System.Diagnostics.DebuggableAttribute. En la versión de depuración, la propiedad IsJitOptimizerEnabled es True, en la versión de lanzamiento es False. Puede ver este atributo en el manifiesto de ensamblaje con ildasm.exe.

El compilador JIT utiliza este atributo para deshabilitar las optimizaciones que dificultarían la depuración. Los que mueven el código como un alzado invariante de bucle. En casos seleccionados, esto puede marcar una gran diferencia en el rendimiento. Aunque no suele ser así.

La correlación de los puntos de interrupción con las direcciones de ejecución es tarea del depurador. Utiliza el archivo .pdb y la información generada por el compilador JIT que proporciona la instrucción IL a la asignación de direcciones de código. Si escribiera su propio depurador, usaría ICorDebugCode :: GetILToNativeMapping().

Cuestiones relacionadas