2009-03-08 5 views
1

Travailler sur .NET me donne généralement de bonnes performances pour l'application elle-même, mais les temps de chargement initiaux pour mon application sont assez importants. Une grande partie va aux assemblages de chargement, ce qui est difficile à évaluer.Optimisations de charge d'application .NET

Y a-t-il des optimisations que je peux appliquer à mes assemblys pour les charger plus rapidement sans impliquer le GAC ou Ngen et qui 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. J'ai .NET Framework 3.5 installé sur ma machine.

Répondre

2

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

Le compilateur JIT charge les modules appelés à partir de la méthode en cours de traitement. Vous devez donc veiller à ce 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 
    } 
} 

Le [MethodImpl (MethodImplOptions.NoInlining)] est nécessaire pour la méthode ContinueStartup() ne le soit pas jit inline, parce que ramènerai les modules à charger trop tôt.

+0

GvS, avez-vous des liens vers des exemples sur la façon de faire cela? –

+0

Cela semble assez doux. Mais un écran de démarrage fantaisie n'est pas ce que je cherche. Les utilisateurs veulent réellement commencer à utiliser le programme immédiatement et la perception d'un écran de démarrage ne va pas aider beaucoup. –

+0

Je sais, mais c'est la meilleure chose qui a fonctionné pour moi. Afficher les commentaires à l'utilisateur que tout est chargé, mieux vaut laisser l'utilisateur attendre sans retour. Si l'utilisateur doit attendre trop longtemps, il redémarre l'application, puis les temps de démarrage augmentent encore plus. – GvS

1

Vous pouvez utiliser ILMerge pour fusionner tous vos assemblages en 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 verrez une réelle amélioration de la vitesse de charge là-bas.

Vous pouvez également supprimer toutes les références à d'autres assemblys, charger l'interface utilisateur à l'utilisateur, et alors qu'il utilise l'interface utilisateur (taper ou autre chose) précharger tous les assemblages nécessaires en utilisant Assembly.Load, obtenir tous les pointeurs de fonction nécessaires en utilisant la réflexion et stockez-les dans les membres internes. De cette façon, l'application se chargera beaucoup plus rapidement. Mais je ne pense pas que toute personne sensée fera l'optimisation comme ça.

0

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

.NET charge l'ensemble à la volée lorsque vous en avez besoin. Vous pouvez décider de diviser votre application en plusieurs assemblées. 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 (interface utilisateur, entreprise, données).

Questions connexes