Me he encontrado con el siguiente párrafo:
“La configuración de depuración frente a lanzamiento en el IDE cuando compila su código en Visual Studio casi no hace ninguna diferencia en el rendimiento ... el código generado es casi el mismo. El compilador de C # realmente no hace ninguna optimización. El compilador de C # solo escupe IL ... y en el tiempo de ejecución es el JITer el que hace toda la optimización. El JITer tiene un modo de depuración / liberación y eso hace una gran diferencia en el rendimiento. Pero eso no elimina si ejecuta la configuración de Depuración o Liberación de su proyecto, eso desactiva si se adjunta un depurador ".
La fuente está aquí y el podcast está aquí .
¿Alguien puede dirigirme a un artículo de Microsoft que realmente pueda probar esto?
Buscar en Google " C # depuración vs rendimiento de la versión " en su mayoría devuelve resultados que dicen " Debug tiene mucho impacto en el rendimiento ", "la versión está optimizada " y " no implemente la depuración en producción ".
fuente
Respuestas:
Parcialmente cierto. En modo de depuración, el compilador emite símbolos de depuración para todas las variables y compila el código tal como está. En el modo de lanzamiento, se incluyen algunas optimizaciones:
El resto depende del JIT.
Lista completa de optimizaciones aquí cortesía de Eric Lippert .
fuente
No hay ningún artículo que "pruebe" nada sobre una pregunta de rendimiento. La forma de demostrar una afirmación sobre el impacto en el rendimiento de un cambio es probarlo en ambos sentidos y probarlo en condiciones realistas pero controladas.
Estás haciendo una pregunta sobre el rendimiento, así que claramente te importa el rendimiento. Si le importa el rendimiento, lo correcto es establecer algunos objetivos de rendimiento y luego redactarse un conjunto de pruebas que rastree su progreso en relación con esos objetivos. Una vez que tenga un conjunto de pruebas de este tipo, puede usarlo fácilmente para comprobar por sí mismo la verdad o la falsedad de declaraciones como "la construcción de depuración es más lenta".
Y, además, podrá obtener resultados significativos. "Más lento" no tiene sentido porque no está claro si es un microsegundo más lento o veinte minutos más lento. "10% más lento en condiciones realistas" es más significativo.
Dedique el tiempo que habría dedicado a investigar esta pregunta en línea para construir un dispositivo que responda la pregunta. Obtendrá resultados mucho más precisos de esa manera. Todo lo que lea en línea es solo una suposición sobre lo que podría suceder. Razón de los hechos que recopiló usted mismo, no de las conjeturas de otras personas sobre cómo podría comportarse su programa.
fuente
No puedo comentar sobre el rendimiento, pero el consejo "no implemente la depuración en producción" todavía se mantiene simplemente porque el código de depuración generalmente hace bastantes cosas de manera diferente en productos grandes. Por un lado, es posible que tenga interruptores de depuración activos y por otro probablemente habrá comprobaciones de sanidad redundantes adicionales y salidas de depuración que no pertenecen al código de producción.
fuente
Desde msdn social
Básicamente, la implementación de depuración será más lenta ya que las optimizaciones del compilador JIT están deshabilitadas.
fuente
Lo que lees es bastante válido. La versión suele ser más sencilla debido a la optimización JIT, sin incluir el código de depuración (#IF DEBUG o [Condicional ("DEBUG")]), la carga mínima del símbolo de depuración y, a menudo, no se considera un ensamblaje más pequeño que reducirá el tiempo de carga. El rendimiento diferente es más obvio cuando se ejecuta el código en VS debido a los PDB más extensos y los símbolos que se cargan, pero si lo ejecuta de forma independiente, las diferencias de rendimiento pueden ser menos evidentes. Cierto código se optimizará mejor que otro y está utilizando la misma heurística de optimización como en otros idiomas.
Scott tiene una buena explicación sobre la optimización del método en línea aquí
Consulte este artículo que brinda una breve explicación de por qué es diferente en el entorno ASP.NET para la configuración de depuración y lanzamiento.
fuente
Una cosa que debe tener en cuenta, con respecto al rendimiento y si el depurador está conectado o no, algo que nos tomó por sorpresa.
Teníamos un código, que involucraba muchos bucles estrechos, que parecía tardar una eternidad en depurar, pero que funcionaba bastante bien por sí solo. En otras palabras, ningún cliente o clientes experimentaron problemas, pero cuando estábamos depurando parecía funcionar como la melaza.
El culpable fue
Debug.WriteLine
uno de los lazos estrechos, que escupió miles de mensajes de registro, salidos de una sesión de depuración hace un tiempo. Parece que cuando el depurador está conectado y escucha dicha salida, hay una sobrecarga involucrada que ralentiza el programa. Para este código en particular, estaba en el orden de tiempo de ejecución de 0.2-0.3 segundos por sí solo, y más de 30 segundos cuando se adjuntó el depurador.Sin embargo, la solución simple es eliminar los mensajes de depuración que ya no se necesitaban.
fuente
En el sitio msdn ...
fuente
En gran medida, eso depende de si su aplicación está vinculada al cómputo, y no siempre es fácil saberlo, como en el ejemplo de Lasse. Si tengo la más mínima pregunta sobre lo que está haciendo, la detengo un par de veces y examino la pila. Si hay algo extra que realmente no necesitaba, eso lo detecta de inmediato.
fuente
Recientemente me encontré con un problema de rendimiento. La lista completa de productos tomaba demasiado tiempo, unos 80 segundos. Ajusté la base de datos, mejoré las consultas y no hubo ninguna diferencia. Decidí crear un TestProject y descubrí que el mismo proceso se ejecutó en 4 segundos. Luego me di cuenta de que el proyecto estaba en modo de depuración y el proyecto de prueba estaba en modo de lanzamiento. Cambié el proyecto principal al modo Release y la lista completa de productos solo tardó 4 segundos en mostrar todos los resultados.
Resumen: el modo de depuración es mucho más lento que el modo de ejecución, ya que mantiene la información de depuración. Siempre debe implementar en modo Relase. Aún puede tener información de depuración si incluye archivos .PDB. De esa manera puede registrar errores con números de línea, por ejemplo.
fuente
Los modos de depuración y liberación tienen diferencias. Hay una herramienta Fuzzlyn : es un fuzzer que utiliza Roslyn para generar programas aleatorios de C #. Ejecuta estos programas en .NET core y garantiza que den los mismos resultados cuando se compilan en modo de depuración y liberación.
Con esta herramienta se encontró y se reportaron muchos errores.
fuente