Pregunta

Trabajar en .NET me da un buen rendimiento en general para la aplicación en sí, pero los tiempos de carga iniciales para mi aplicación son bastante grandes. Mucho de esto va hacia la carga de ensamblajes que es difícil de calibrar.

¿Hay algunas optimizaciones que pueda aplicar a mis ensamblajes para que sean más rápidos de cargar sin involucrar al GAC o Ngen y no están disponibles para ClickOnce?

Este es un proyecto WinForms 2.0. Puedo actualizarlo a 3.5 pero eso limita mi base de usuarios. Tengo .NET Framework 3.5 instalado en mi máquina.

¿Fue útil?

Solución

He creado un archivo .exe muy pequeño que muestra una pantalla de inicio lo antes posible. Después de eso inicializo todo.

El compilador JIT carga módulos que se llaman desde el método que se está procesando. Por lo tanto, debe tener cuidado de que el método que muestra la pantalla de inicio no llame a los métodos en los módulos que aún no desea que se carguen.

Ejemplo:

internal sealed class Startup {

    // Call Startup.Run() from Program.Main to start the application
    internal void Run() {
        this.ShowSplash();
        this.ContinueStartup();
    }

    private void ShowSplash() {
        _splash = new Splash();
        _splash.Show();
        Application.DoEvents();
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    private void ContinueStartup() {
        // Do the startup here
    }
}

El [MethodImpl (MethodImplOptions.NoInlining)] es necesario para que el método ContinueStartup () no se incorpore con la jit, porque eso hará que los módulos se carguen antes de tiempo.

Otros consejos

Puede usar ILMerge para combinar todos sus ensamblajes en un archivo. Leer un archivo en la memoria es más rápido que leer 10 archivos. Aunque dudo que veas una mejora real en la velocidad de carga allí.

También puede eliminar todas las referencias a otros conjuntos, cargar la interfaz de usuario para el usuario, y mientras usa la interfaz de usuario (escribiendo u otra cosa), precargar todos los conjuntos necesarios utilizando Assembly.Load, obtenga todos los punteros de función necesarios utilizando Reflexión y almacenamiento en miembros internos. De esta manera la aplicación se cargará mucho más rápido. Pero no creo que ninguna persona sensata haga una optimización como esta.

¿Puede describir su número de ensamblajes que tiene?

.NET carga el ensamblaje sobre la marcha cuando los necesita. Puedes decidir dividir tu aplicación en varios ensamblajes. Los ensamblajes deben dividirse por medio de: estrategia de implementación, seguridad y rendimiento. La mayoría de las aplicaciones están divididas por una estructura de 3 capas (IU, negocio, datos).

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