Algunos desarrolladores anteriores pusieron algunos ensamblajes que se construyeron en modo de depuración en producción. ¿Vale la pena recompilarlos en modo de lanzamiento y volver a implementarlos? Si solo hay un aumento de rendimiento del 1-2%, probablemente los deje allí. Por otro lado, un aumento del 10-20% podría cambiar mi opinión.¿Diferencia de rendimiento entre un ensamblado .NET integrado en modo depuración y versión?
Respuesta
Tuve la misma pregunta hace un año porque teníamos problemas importantes de rendimiento en la producción. Tal como me lo explicaron desde el soporte de MS Premier, las versiones de compilación de depuración incluyen ganchos para la depuración que pueden dar como resultado un aumento del 1 al 10% en el consumo de memoria dependiendo de lo que haga la aplicación.
Si no tiene problemas, déjelos en paz, pero si tiene problemas con el consumo de memoria, continúe y vuelva a compilar/implementar.
En mi experiencia, vi una diferencia de 30-40%. Esto fue con DotNetZip, una biblioteca que hace encriptación, compresión y un pequeño archivo de E/S. Más del 85% del tiempo se gastó en encriptación y compresión, solo moviendo bytes.
Otro argumento en contra del uso de compilaciones de depuración en producción es porque consumen mucha más memoria ya que se requieren cargar símbolos de depuración.
En general, verá un beneficio porque la versión de lanzamiento generalmente se compila con optimizaciones utilizando la opción del compilador /optimize
. Sin embargo, cuán grande será la diferencia dependerá de su ensamblaje específico: necesitará un perfil.
Descubrí que la diferencia de rendimiento aumenta exponencialmente con la complejidad del código: una aplicación simple solo puede ver una diferencia del 5%, pero he visto hasta un 50% de ralentización en aplicaciones complejas, especialmente las que implican estructuras de datos más grandes como matrices o mapas.
Por supuesto, existe la posibilidad de que el código de depuración también sea ligeramente diferente, dependiendo de cómo esté configurado: consulte las aserciones, por ejemplo.
Vale la pena señalar que el código de liberación elimina también algunas cosas como preprocesador:
#if DEBUG
...
#endif
También elimina Debug.WriteLine, Debug.Assert, y algunas otras cosas en el espacio de nombres System.Diagnostics, que puede ser útil en las pruebas, pero no tienen sentido en el código bien diseñado para la versión de lanzamiento.
Si observa el código IL generado para las compilaciones de depuración y liberación, las diferencias son generalmente bastante pequeñas. La mayoría de las diferencias se encuentran en comandos nop adicionales en los puntos de origen clave para admitir la edición y la continuación y la depuración de la línea de origen. Sin embargo, cuando el tiempo de ejecución de .NET realmente JITs el MSIL, el ensamblaje del tiempo de ejecución es casi idéntico. La mayor diferencia se produce cuando se adjunta un depurador. Eso evitará que el JIT optimice el código de ejecución real.
Las versiones de lanzamiento son a menudo mucho más pequeñas porque simplemente no incluyen tanto código. Puede haber parches de código rodeados de instrucciones #de DEBUG y atributos condicionales que instruyen al compilador a omitir llamadas a métodos en modo de lanzamiento (Like Debug.WriteLine).
He encontrado que los métodos Debug.WriteLine y Trace.WriteLine, cuando se dejan en el código de producción y tienen implicaciones significativas de rendimiento incluso si no hay un depurador conectado.
- 1. Diferencia entre ASP.NET y .NET framework versión
- 2. Versión vs Modo de Depuración en IDE
- 3. Diferencia entre ensamblado y DLL
- 4. depuración visual studio vs versión modo
- 5. En .NET, ¿cuál es la diferencia entre el recurso integrado y el recurso?
- 6. Depuración en .NET en modo de lanzamiento
- 7. Xcode Diferencia entre la depuración y la versión
- 8. ¿Hay alguna diferencia (de rendimiento) entre Depurar y Liberar?
- 9. Cambiar la versión de ensamblaje en un ensamblado .NET compilado
- 10. programación detección de modo de lanzamiento/depuración (NET)
- 11. Diferencia entre rendimiento en Python y rendimiento en C#
- 12. Diferencia de rendimiento entre IIf() y Si
- 13. Diferencia entre las dependencias del proyecto y DLL en .Net en el ensamblado compilado última
- 14. ¿Cuál es la diferencia entre el modo de canalización "clásico" e "integrado" en IIS7?
- 15. Cómo reasignar versión de ensamblado
- 16. diferencias de rendimiento entre depuración y liberación construye
- 17. ¿Comparar 2 versiones de un ensamblado .NET?
- 18. ¿Cuál es la diferencia entre el modo de depuración y el modo de lanzamiento en Visual Studio 2010?
- 19. Diferencia entre UnhandledException y DispatcherUnhandledException en .NET
- 20. ¿Hay alguna diferencia de rendimiento entre la depuración Javac activada y desactivada?
- 21. ¿Cuál es la diferencia entre "Versión heredada" y "Versión estable"?
- 22. ¿Diferencia entre la versión binaria y la versión original?
- 23. .NET: Diferencia entre PasswordDeriveBytes y Rfc2898DeriveBytes
- 24. ¿Es posible crear un método de solo depuración en .NET?
- 25. ¿Hay alguna diferencia de rendimiento entre Begin * y * Async para sockets en .NET?
- 26. Diferencia de rendimiento entre Innodb y Myisam en Mysql
- 27. Diferencia entre depuración gota y gota en Oracle
- 28. El ensamblado System.Web no se encuentra en .net 4.0 versión
- 29. ¿El tamaño de ensamblado .NET afecta el rendimiento?
- 30. Diferencia entre ASP.Net, C# .Net y VB.Net?