que - Configuración de una aplicación C#para la construcción de máximo rendimiento
visual basic and c# (4)
Así que estamos muy contentos con nuestro programa. Es rápido y estable en el modo de depuración y hasta ahora esa es la versión en vivo con los clientes. Ahora deseamos ese impulso libre que obtenemos de una versión de lanzamiento.
Ahora he compilado el proyecto para Release con Code Optimization: On. Tengo la traza constante: apagado. Avanzado -> salida -> información de depuración -> Ninguna.
Además de las prácticas de codificación eficientes y la arquitectura del sistema, etc., ¿cuáles son las configuraciones óptimas de Visual Studio para ajustar la aplicación C # para el máximo rendimiento?
Que yo sepa, el JITter optimiza la compilación de IL por defecto en las versiones de lanzamiento. La Optimización de Código (: Encendido) concierne al compilador y cómo trata la alineación, etc.
¿Es eso o hay más? ¿Es un error dar vuelta a la constante TRACE? (nuestra aplicación nos envía un correo con el árbol de pila si algo serio debería salir mal, no estoy seguro de que TRACE esté relacionado aquí)
El rendimiento entre la versión y la depuración suele ser apenas perceptible.
La mayoría de los programas de C # pasan la mayor parte de su tiempo en ensamblajes .net que ya están optimizados.
Estas son las configuraciones recomendadas que elegiría para una compilación de lanzamiento, todas estas configuraciones se encuentran en la pestaña "Generar" de las propiedades del proyecto:
- Desmarque "Definir constante DEBUG"
- Desmarque "Definir constante de rastreo"
- Marque "Opimize code"
- En el cuadro de diálogo "Avanzado ...", configure "Información de depuración:" en "sólo pdb"
También puede considerar usar ngen para acelerar el tiempo de inicio de la aplicación. Este proceso debe realizarse en la PC del usuario final (normalmente como parte del proceso de instalación), sin embargo, generalmente solo mejorará el rendimiento de la aplicación la primera vez que se ejecute *. Mi consejo sería considerar usar ngen solo si tiene una inquietud específica sobre el tiempo de arranque en frío de su aplicación.
¿Qué hacen realmente estos ajustes?
Constantes DEBUG y TRACE
Las constantes DEBUG
y TRACE
afectan a cualquier código incluido en directivas condicionales , por ejemplo: (Sustituya DEBUG por TRACE como se desee)
#if DEBUG
// Anything here will not appear in the end output unless the DEBUG constant is defined
#endif
También afecta a las llamadas a los métodos marcados con el atributo Condicional , como Debug.Write
y Trace.Write
:
// The following call will not appear in the end output unless the DEBUG constant is defined
Debug.WriteLine("Test");
Puedes comprobar ambos por ti mismo usando algo como IL Spy .
Tenga en cuenta que estas constantes no tienen ningún otro efecto, por ejemplo, el JITer no se comporta de manera diferente si se define la constante DEBUG
. Probablemente encontrará que estos tienen un efecto insignificante en su aplicación a menos que haga un uso considerable de las directivas condicionales.
Optimizar código
Esto controla qué optimización realizan tanto el compilador (cs.exe) como el compilador JIT al compilar su código. Es probable que vea la mayor parte de sus mejoras de rendimiento como resultado de esta configuración.
La siguiente pregunta cubre qué hace esta configuración con más detalle:
Información de depuración
La pdb-only
le dice al compilador que ponga toda la información de depuración en un archivo .pdb (base de datos de programas) separado. En lo que respecta al ensamblaje final, esto es exactamente el mismo que none
en el hecho de que el ensamblaje no se ve afectado, sin embargo, si utiliza los pdb-only
(sobre el ajuste de none
), los símbolos están al menos disponibles si lo desea (usted No tienes que distribuirlos si no quieres. Esto puede ser bastante útil, por ejemplo, cuando se depuran volcados de fallos.
Tenga en cuenta que no puede "volver" y volver a generar símbolos para un ensamblaje existente; una vez que pierde un .pdb para un ensamblaje (o elige no crear uno en primer lugar), ¡se pierde casi para siempre! Cuídelo (especialmente para los ensamblajes que suelte "a la naturaleza").
La única diferencia real que verá aquí es el tamaño del conjunto de salida: esto puede afectar los tiempos de carga y la huella de memoria, pero en última instancia, esta configuración probablemente no tenga un efecto particularmente notable.
(*) Suponiendo que el usuario ejerza la mayoría / todas las funciones de la aplicación la primera vez que la ejecute, el proceso JITing se realiza como un método llamado. Lea sobre JITting / ngen para más detalles.
No hay mucho más que pueda hacer a través de VS que le proporcionará un aumento de rendimiento significativo o notable. Será mejor que pase el tiempo ejecutando el programa a través del generador de perfiles y observe dónde puede ajustar el código. Dedique un poco de tiempo a refactorizar parte del código en particular relacionado con IO, db y use paralelo / thread y el almacenamiento en caché cuando sea apropiado, puede obtener un resultado mucho mejor
Un enfoque que he visto usado en varios programas (Paint.NET y Adobe Acrobat Reader vienen a la mente) es que usan ngen
en sus ensamblajes administrados al instalar. Esto proporciona un pequeño aumento en el tiempo de ejecución, pero los tiempos de inicio se reducen, ya que no es necesario utilizar JIT.
Esto se puede utilizar junto con otras optimizaciones que haces.
(Tenga en cuenta que no puede ejecutar ngen
como parte de su proceso de compilación, ya que tiene en cuenta los detalles del hardware en el que se está ejecutando actualmente)