c# - Depuración frente a publicación en.NET
asp.net (9)
"Depurar" y "Liberar" son solo nombres para configuraciones predefinidas de proyectos definidas por Visual Studio.
Para ver las diferencias, consulte la pestaña Compilar en Propiedades del proyecto en Visual Studio.
Las diferencias en VS2005 incluyen:
Constante DEBUG definida en la configuración de depuración
Código optimizado habilitado en la configuración de la versión
así como otras diferencias que puede ver haciendo clic en el botón "Avanzado"
Pero puedes:
Cambie la configuración de compilación para las configuraciones de depuración y liberación en Project Propeties / Build
Cree sus propias configuraciones personalizadas haciendo clic derecho en la solución en el Explorador de soluciones y seleccionando Configuration Manager
Creo que el comportamiento de la constante DEBUG es bastante claro (se puede hacer referencia en la directiva #if preprocessor o en ConditionalAttribute). Pero no conozco ninguna documentación exhaustiva sobre exactamente qué optimizaciones están habilitadas; de hecho, sospecho que Microsoft querría tener la libertad de mejorar su optimizador sin previo aviso.
Continuando con mi pregunta anterior , ¿hay un documento completo que enumere todas las diferencias disponibles entre los modos de depuración y liberación en una aplicación de C #, y particularmente en una aplicación web?
¿Qué diferencias hay?
Debug and Release son solo etiquetas para diferentes configuraciones de soluciones. Puede agregar otros si lo desea. Si lo desea, puede agregar más configuraciones desde el administrador de configuración.
http://msdn.microsoft.com/en-us/library/kwybya3w.aspx
Grandes diferencias -
1.En un dll de depuración, se agregan varias instrucciones adicionales para permitirle establecer un punto de interrupción en cada línea de código fuente en Visual Studio. Además, el código no se optimizará, ya que le permite depurar el código. En la versión de lanzamiento, estas instrucciones adicionales se eliminan.
2. El archivo PDB se crea solo en modo Depuración y no en modo relese.
3. En el modo de lanzamiento, cpde está optimizado por el optimizador integrado en el compilador JIT. Hace las siguientes optimizaciones:
• Inlineación del método: una llamada al método se reemplaza por la inyección del código del método.
• Asignación de registro de CPU: las variables locales y los argumentos de método pueden permanecer almacenados en un registro de CPU sin que nunca (o con menos frecuencia) se almacenen de nuevo en el marco de la pila.
• Eliminación de comprobación de índice de matriz: una optimización importante cuando se trabaja con matrices (todas las clases de colección .NET usan una matriz internamente). Cuando el compilador JIT puede verificar que un bucle nunca indexa una matriz fuera de límites, eliminará la verificación del índice.
• Loop unrolling - Short loops (up to 4) with small bodies are eliminated by repeating the code in the loop body.
• Dead code elimination - A statement like if (false) { /.../ } gets completely eliminated.
• Code hoisting- Code inside a loop that is not affected by the loop can be moved out of the loop.
• Common sub-expression elimination. x = y + 4; z = y + 4; becomes z = x
Dibujar con GDI + es considerablemente más lento en el modo de depuración.
No conozco un documento conciso, pero:
- Las llamadas Debug.Write se eliminan en la versión
- En Release, su CallStack puede parecer un poco "extraño" debido a las optimizaciones, como lo describe Scott Hanselman
No hay un documento que enumere las diferencias. Además de algunas de las diferencias ya enumeradas, la compilación en modo de depuración desactiva la mayoría de las optimizaciones del compilador JIT que se realizan en el tiempo de ejecución y también emite información de depuración más completa en el archivo de base de datos de símbolos (.pdb).
Otra gran diferencia es que el comportamiento del GC es algo diferente en el sentido de que el compilador JIT insertará las llamadas a GC.KeepAlive () según sea apropiado / necesario para soportar las sesiones de depuración.
Obtuve un mensaje de error cuando distribuyo el archivo ejecutable a otra máquina que indica que el sistema perdió MSVCP110D.dll.
La solución a este problema se indica en pregunta Falta Visual Studio MSVCP110D.dll .
EN XXXXD.dll D significa que el archivo DLL es una versión de depuración del archivo DLL. Pero los paquetes MS Visual C ++ redistribuibles incluyen solo la versión de lanzamiento de los archivos DLL.
Eso significa que si necesita distribuir un programa desarrollado por Visual C ++ , necesita compilarlo en modo Release. Y también debe instalar MS Visual C ++ Redistributable (versión correcta) en la máquina de destino.
Así que creo que esta es una de las principales diferencias entre el modo de depuración y el de liberación.
También puede administrar alguna parte del código que desee ejecutar solo en depuración o solo en versión con marcas de preprocesador:
#if DEBUG
// Some code running only in debug
#endif
o
#if NOT DEBUG
// Some code running only in release
#endif
Un área de rendimiento importante si está utilizando cualquiera de los controles Ajax de ASP.NET: la información de depuración se elimina de la biblioteca de JavaScript cuando se ejecuta en versión, y he visto mejoras importantes de preformance en páginas complicadas. Otros recursos basados en web pueden almacenarse en caché o no almacenarse en caché según esta configuración.
Además, recuerde que Depurar / Liberar en una aplicación web está dictado por el archivo web.config
, no por su configuración en Visual Studio.
<system.web>
<compilation debug="true">
Más información:
Versión de lanzamiento:
es considerablemente más rápido (más importante), optimizado
no se puede debutar (paso a paso)
y el código escrito en la directiva "debug" no está incluido
Vea ¿Cuál es la diferencia entre una compilación de depuración frente a versión? .