Pregunta

Me di cuenta de que la aplicación de WPF de inicio es a veces muy lento.¿Alguien sabe si la causa es los elementos de la inicialización o Dll de carga o algo más?

¿Fue útil?

Solución

El siguiente texto fue extraído de este artículo de MSDN en la Mejora de las aplicaciones de WPF tiempo de inicio (Edición:ahora fusionada en Aplicación de WPF Tiempo de Inicio)

Tiempo De Inicio De La Aplicación

La cantidad de tiempo que se requiere para una aplicación de WPF para empezar puede variar enormemente.En este tema se describen varias técnicas para reducir el percibido y real de tiempo de inicio de Windows Presentation Foundation (WPF) de la aplicación.

La comprensión de Arranque en Frío y WarmStartup

De arranque en frío se produce cuando la aplicación se inicia por primera vez después de reiniciar el sistema, o cuando se inicia la aplicación, se cierra, y luego se comienza de nuevo después de un largo período de tiempo.Cuando se inicia una aplicación, si las páginas (código estático de datos, registro, etc) no están presentes en la memoria de Windows, el administrador de la lista de espera, los fallos de página se producen.El acceso a disco es necesario para llevar las páginas en la memoria.

De arranque en caliente se produce cuando la mayoría de las páginas de los principales common language runtime (CLR) de los componentes ya están cargados en la memoria, que ahorra costosos tiempo de acceso al disco.Es por eso que una aplicación administrada se inicia más rápido cuando se ejecuta una segunda vez.

Implementar una Pantalla de presentación

En los casos en los que existen importantes, inevitable retraso entre el inicio de una aplicación y la visualización de la interfaz de usuario, optimizar la percepción del tiempo de inicio mediante el uso de un pantalla de presentación.Este enfoque muestra una imagen casi inmediatamente después de que el usuario inicia la aplicación.Cuando la aplicación está lista para mostrar su interfaz de usuario, la pantalla se atenúa.Comenzando en el .NET Framework 3.5 SP1, puede utilizar la SplashScreen clase para implementar una pantalla de presentación.Para obtener más información, consulte Cómo:Añadir una Pantalla de presentación para una Aplicación de WPF.

También puede implementar su propia pantalla de presentación mediante el uso nativo Win32 gráficos.Mostrar su aplicación antes de la Ejecutar se llama al método.

Analizar el Código de Inicio

Determinar la razón de un lento arranque en frío.E/S de disco puede ser responsable, pero esto no es siempre el caso.En general, se debe minimizar el uso de recursos externos, tales como los de red, servicios Web, o de disco.

Antes de la prueba, compruebe que no hay otras aplicaciones en ejecución o uso de los servicios de código administrado o WPF código.

Inicie la aplicación de WPF inmediatamente después de un reinicio, y determinar cuánto tiempo se tarda en mostrar.Si todos los lanzamientos posteriores de su aplicación (arranque en caliente) son mucho más rápidos, su inicio en frío problema es más probable que sea causado por I/O.

Si de la aplicación de inicio en frío problema no está relacionado con I/O, es probable que su aplicación se realiza largo de la inicialización o el cálculo, la espera de algún acontecimiento para completar, o requiere una gran cantidad de compilación JIT en el inicio.Las siguientes secciones describen algunas de estas situaciones en más detalle.

Optimizar La Carga Del Módulo

El uso de herramientas tales como Process Explorer (Procexp.exe) y Tlist.exe para determinar qué módulos de la aplicación se carga.El comando de Tlist <pid> muestra todos los módulos que se cargan mediante un proceso.

Por ejemplo, si no se conecta a la Web y ver que System.Web.dll se carga, hay un módulo en la aplicación que hace referencia a esta asamblea.Asegúrese de que es necesaria la referencia.

Si su aplicación tiene varios módulos de combinación de ellos en un solo módulo.Este enfoque requiere menos CLR de la asamblea de la carga de la sobrecarga.Menos asambleas también significa que el CLR mantiene menos del estado.

Aplazar Las Operaciones De Inicialización

Considere la posibilidad de posponer el código de inicialización hasta después de la ventana principal de la aplicación está traducida.

Ser conscientes de que la inicialización se puede realizar dentro de un constructor de la clase, y si el código de inicialización de referencias de otras clases, puede causar un efecto de cascada en el que muchos constructores de clase son ejecutados.

Evitar La Configuración De La Aplicación

Considere la posibilidad de evitar la configuración de la aplicación.Por ejemplo, si tiene una aplicación simple de los requisitos de configuración y un estricto tiempo de inicio de las metas, las entradas de registro o un simple archivo INI puede ser un inicio más rápido de la alternativa.

Utilizar el GAC

Si una asamblea no está instalado en la Caché de ensamblados Global (GAC), hay demoras causadas por los hash verificación de ensamblados con nombre seguro y por Ngen imagen de la validación si un nativo de la imagen para que la asamblea está disponible en el equipo.Fuerte-verificación de nombre se omite para todas las asambleas instalado en el GAC.Para obtener más información, consulte Gacutil.exe Caché De Ensamblados Global (Herramienta).

Uso Ngen.exe

Considere la posibilidad de usar el Generador de Imágenes Nativas (Ngen.exe) en su aplicación.El uso de Ngen.exe significa que el comercio de consumo de CPU por más de acceso al disco porque el nativo de la imagen generada por Ngen.exe es probable que sea mayor que el de MSIL imagen.

Para mejorar el tiempo de arranque en caliente, usted siempre debe usar Ngen.exe en su aplicación, ya que esto evita el costo de CPU de la compilación JIT del código de la aplicación.

En algunos de arranque en frío de los escenarios, Ngen.exe también puede ser útil.Esto es porque el compilador JIT (mscorjit.dll) no tiene que ser cargado.

Tener tanto Ngen y JIT módulos pueden tener el peor efecto.Esto es debido a que mscorjit.dll debe de ser cargado, y cuando el compilador JIT de obras en el código, muchas páginas en los Ngen las imágenes deben ser de acceso cuando el compilador JIT lee las asambleas de metadatos.

Ngen y ClickOnce

La forma en que planea implementar su aplicación también puede hacer una diferencia en el tiempo de carga.Implementación de la aplicación ClickOnce no admite Ngen.Si usted decide utilizar Ngen.exe para su aplicación, usted tendrá que utilizar otro mecanismo de implementación, tales como el Instalador de Windows.

Para obtener más información, consulte Ngen.exe (Generador De Imágenes Nativas).

Reajuste y DLL Dirección de Colisiones

Si usted utiliza Ngen.exe, ser consciente de que el reajuste puede ocurrir cuando el nativo de imágenes se cargan en la memoria.Si un archivo DLL no está cargado en su dirección base preferida debido a que el rango de direcciones que ya se ha asignado, el cargador de Windows se carga en otra dirección, que puede ser una operación que consuma mucho tiempo.

Usted puede utilizar el Volcado de Direcciones Virtuales (Vadump.exe herramienta para comprobar si hay módulos en los que todas las páginas son privadas.Si este es el caso, el módulo puede haber sido reajustado a una dirección diferente.Por lo tanto, de sus páginas no puede ser compartida.

Para obtener más información acerca de cómo establecer la dirección base, ver Ngen.exe (Generador De Imágenes Nativas).

Optimizar Authenticode

La comprobación de Authenticode agrega a la hora de inicio.Authenticode-firmado asambleas deben ser verificados con la autoridad de certificación (CA).Esta verificación puede llevar mucho tiempo, ya que pueden requerir la conexión a la red varias veces para descargar actuales listas de revocación de certificados.También se asegura de que hay una completa cadena de validez de los certificados en la ruta de acceso a una raíz de confianza.Esto se puede traducir a varios segundos de retraso, mientras que la asamblea está siendo cargado.

Considere la posibilidad de instalar el certificado de la CA en el equipo cliente, o evitar el uso de Authenticode cuando es posible.Si usted sabe que su aplicación no necesita de la editorial pruebas, usted no tiene que pagar el costo de la verificación de la firma.

A partir de .NET Framework 3.5, hay una opción de configuración que permite la comprobación de Authenticode a ser excluidas.Para ello, agregue el siguiente valor a la aplicación.exe.archivo de configuración:

<configuration>
 <runtime>
    <generatePublisherEvidence enabled="false"/>
  </runtime>
</configuration>

Comparar el Rendimiento en Windows Vista

El administrador de memoria en Windows Vista tiene una tecnología llamada SuperFetch.SuperFetch analiza el uso de la memoria de los patrones a lo largo del tiempo para determinar el óptimo de la memoria de contenido para un usuario específico.Se trabaja continuamente para mantener el contenido en todo momento.

Este enfoque difiere de la pre-fetch técnica que se utiliza en Windows XP, que precarga de datos en la memoria sin necesidad de analizar los patrones de uso.Con el tiempo, si el usuario utiliza la aplicación de WPF con frecuencia en Windows Vista, el tiempo de arranque en frío de la aplicación puede mejorar.

El Uso De Dominios De Aplicación De Manera Eficiente

Si es posible, la carga de ensamblados en un dominio neutro código de área para asegurarse de que la imagen nativa, si existe, se utiliza en todos los dominios de aplicación creadas en la aplicación.

Para el mejor rendimiento, exigir el cumplimiento eficiente de la cruz-dominio de la comunicación mediante la reducción de las llamadas entre dominios.Cuando sea posible, utilizar las llamadas sin argumentos o con un tipo primitivo argumentos.

Utilice el Atributo NeutralResourcesLanguage

El uso de la NeutralResourcesLanguageAttribute para especificar el neutro de la cultura para el ResourceManager.Este enfoque evita incorrecta de la asamblea de las búsquedas.

El uso de la Clase BinaryFormatter para la Serialización

Si debe utilizar la serialización, el uso de la BinaryFormatter clase en lugar de la XmlSerializer clase.El BinaryFormatter la clase se implementa en la Biblioteca de clases Base (BCL) en el mscorlib.dll de la asamblea.El XmlSerializer se implementa en el System.Xml.dll la asamblea, que puede ser un archivo DLL adicional a la carga.

Si debe utilizar el XmlSerializer de clase, se puede lograr un mejor rendimiento si antes de generar el ensamblado de serialización.

Configurar ClickOnce para Comprobar si hay Actualizaciones Después del Inicio

Si utiliza la aplicación ClickOnce, evitar el acceso a la red en el inicio de la configuración de ClickOnce para comprobar el lugar de despliegue de actualizaciones después de que se inicia la aplicación.

Si utiliza el explorador XAML (XBAP) de aplicación del modelo, tenga en cuenta que ClickOnce comprueba la implementación del sitio web para las actualizaciones incluso si la XBAP ya en el ClickOnce caché.Para obtener más información, consulte Seguridad e Implementación de ClickOnce.

Configurar el PresentationFontCache Servicio se Inicie Automáticamente

La primera aplicación de WPF para ejecutar después de un reinicio es el PresentationFontCache servicio.El servicio se almacena en caché de las fuentes del sistema, mejora de fuentes de acceso y mejora el rendimiento global.Hay una sobrecarga en el arranque del servicio, y en algunos ambientes controlados, considere la posibilidad de configurar el servicio para que se inicie automáticamente cuando se reinicia el sistema.

Establecer El Enlace De Datos Mediante Programación

En lugar de utilizar XAML para establecer el DataContext de forma declarativa para la ventana principal, considere la posibilidad de establecer mediante programación en el OnActivated método.

Otros consejos

El tiempo de inicio de una aplicación WPF puede ser mucho más rápido si se utiliza Marco de 3.51 y no 3.5 o 3.0. El 3.51 es realmente una mejora.

El consejo más útil en la fijación de rendimiento de inicio de WPF que he visto nunca se le dio en esta otra pregunta : ejecutar 'actualización NGEN' en cada carpeta de marco.

Parece que Microsoft no puede mantener su caché NGEN hasta a la fecha, lo que se traduce en la aplicación de más o menos la mitad de recompilar el marco .NET cada inicio.

Es difícil de creer, pero parece ser cierto.

Este es un viejo hilo, pero he terminado aquí varias veces al tratar de solucionar un problema de rendimiento de inicio con las aplicaciones WPF en mi sistema Win10, por lo que pensé en afirmar una respuesta que puede ayudar a los demás - una respuesta que toma un tiempo de 5 segundos de arranque horrible para todas las aplicaciones WPF en este sistema reduce a sólo unos pocos milisegundos. Eliminar el controlador de NVIDIA "3D Vision" . Tengo una tarjeta GeForce GTX 650, y el conductor "3D Vision" no parece ofrecer algo útil, por lo que la eliminación es ningún problema para mí. La herramienta de análisis de rendimiento VisualStudio2015 finalmente ayudó muestran que casi todo el tiempo de inicio de 5 segundos se pasó inactivo después de una llamada a través nvapi64.dll - el controlador de NVIDIA. Wow.

Lo que más me ayudó desde el excelente artículo que vincula a Stuart era el truco XmlSerializer. Que realmente afeitado hasta unos cuantos segundos. Por otra parte no hay que subestimar la desfragmentación del HD: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top