Question

Travailler sur .NET me donne de bonnes performances en général pour l’application elle-même, mais les temps de chargement initiaux de mon application sont assez longs. Une grande partie de cette somme sert à charger des assemblages, ce qui est difficile à évaluer.

Existe-t-il des optimisations que je peux appliquer à mes assemblages pour les charger plus rapidement sans faire appel à GAC ou Ngen et ceux-ci ne sont pas disponibles pour ClickOnce?

Ceci est un projet WinForms 2.0. Je peux le mettre à niveau vers un 3.5 mais cela limite ma base d'utilisateurs. .NET Framework 3.5 est installé sur ma machine.

Était-ce utile?

La solution

J'ai créé un très petit fichier .exe qui affiche un écran de démarrage dès que possible. Après cela, tout est initialisé.

Le compilateur JIT charge les modules appelés à partir de la méthode en cours d’envoi. Vous devez donc vous assurer que la méthode qui affiche l'écran de démarrage n'appelle pas les méthodes dans les modules que vous ne voulez pas encore charger.

Exemple:

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
    }
}

La méthode [MethodImpl (MethodImplOptions.NoInlining)] est nécessaire pour que la méthode ContinueStartup () ne soit pas insérée par le jit, car cela entraînerait un chargement trop précoce des modules.

Autres conseils

Vous pouvez utiliser ILMerge pour fusionner tous vos assemblages dans un seul fichier. La lecture d’un fichier en mémoire est plus rapide que la lecture de 10 fichiers. Bien que je doute que vous constatiez une réelle amélioration de la vitesse de chargement à cet endroit.

Vous pouvez également supprimer toutes les références à d'autres assemblys, charger l'interface utilisateur pour l'utilisateur, et pendant qu'il utilise l'interface utilisateur (saisie ou autre), précharger tous les assemblys nécessaires à l'aide de Assembly.Load, obtenir tous les pointeurs de fonction nécessaires à l'aide de réflexion et les stocker dans des membres internes. De cette façon, l'application se chargera beaucoup plus rapidement. Mais je ne pense pas qu'une personne sensée fasse l'optimisation de ce genre.

Pouvez-vous décrire votre nombre d'assemblages?

.NET charge l'assemblage à la volée lorsque vous en avez besoin. Vous pouvez décider de scinder votre application en plusieurs assemblages. Les assemblages doivent être divisés au moyen de: stratégie de déploiement, sécurité et performance. La plupart des applications sont divisées en 3 couches de structure (interface utilisateur, entreprise, données).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top