Para un proyecto en desarrollo estamos evaluando la posibilidad de hacer todo en C++ en lugar de una combinación C++/C# (queremos usar WPF). La razón de esta decisión es una: nuestra aplicación debe iniciarse al iniciar la PC y el tiempo de arranque de .NET es demasiado largo para la experiencia de usuario que queremos lograr. Nuestro caso es muy drástico, ya que buscamos tiempos de arranque virtualmente instantáneos. Si nos decidimos por C++ de forma exclusiva vamos a perder bastante productividad en el proyecto al abandonar WPF.
El problema de lentitud en el primer arranque de una aplicación en .NET (cold start) no es nuevo. Es tan importante que una de las principales mejoras que .NET 3.5 SP1 ofrecerá próximamente es precisamente la disminución de ese tiempo. El arranque después de la segunda vez (warm start) es mucho más rápido y no es un problema tan grave. Además de lo que pueda hacer Microsoft, hay diversas técnicas para mejorar la velocidad de arranque la primera vez (cold start) de una aplicación WPF. Las principales son:
- Mejora la percepción del usuario utilizando una pantalla de arranque (splash screen) que puede ser en código nativo. http://blogs.msdn.com/jgoldb/default.aspx
- Pospón cualquier inicialización que no sea indispensable.
- Coloca cualquier ensamblado con "strong-name" en el GAC.
- Examina la posibilidad de pre compilar tu aplicación con NGEN
- Esta opción es posible que tenga efectos contraproducentes. Por un lado te evitas el tiempo de procesamiento del compilador JIT pero por otro las imagenes de tus componentes en disco serán más grandes. La única forma de mediar el efecto es probándolo para tu caso específico. http://blogs.msdn.com/clrcodegeneration/archive/2007/09/15/to-ngen-or-not-to-ngen.aspx
- Esta opción es posible que tenga efectos contraproducentes. Por un lado te evitas el tiempo de procesamiento del compilador JIT pero por otro las imagenes de tus componentes en disco serán más grandes. La única forma de mediar el efecto es probándolo para tu caso específico. http://blogs.msdn.com/clrcodegeneration/archive/2007/09/15/to-ngen-or-not-to-ngen.aspx
- Si usas authenticode, evalúa si realmente lo necesitas. Todo el código authenticode debe ser verificado con la autoridad certificadora y eso toma tiempo. Es posible deshabilitar este proceso a partir de .NET 3.5 así:
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
Info aquí: http://msdn2.microsoft.com/en-us/library/bb629393.aspx
- Minimiza el uso de serialización. Si la necesitas, trata de usar BinaryFormatter en lugar de XmlSerializer.
- Configura el servicio "PresentationFontCache" para que arranque automáticamente. Este servicio es utilizado por la primera aplicación WPF que corre en la PC e incurre en un tiempo de arranque.
Como siempre tratándose de temas de desempeño es fundamental mediar el impacto que tenga cada cambio que hagas. Adivinar no funciona.