8
votes

Une application de 110 kb .NET 4.0 a besoin de 10 secondes pour un démarrage à froid, ce n'est pas acceptable!

J'utilise le profil client .NET 4.0 pour mon application et j'exécute un double noyau avec 4 Go de RAM et un disque dur rapide.

Rien grand est terminé au début Il suffit d'afficher une liste générique dans un WPF ListView.

Comment puis-je faire commencer le froid de mon assemblage?

J'ai fait maintenant à nouveau un démarrage à froid et exécutez la fenêtre WindowsApplication.exe dans mon dossier \ obj \ x86 \ de débogage et mon disque dur comme l'enfer et il a fallu 10,5 secondes ???

Qu'est-ce qui ne va pas?

Le début chaud après que le froid ait pris 1 seconde.

Java 6 applications n'a pas ce problème, pas du tout pour comparer ...

mise à jour:

Je supprime toutes les méthodes qui lisent des données lorsque mes images de vue sont créées.

toujours 10 secondes pour apparaître. Ce n'est pas un problème de lecture de données de RAM. Le problème est le disque dur lourdement occupé qui n'a jamais été aussi bruyant sauf exécution d'une application .NET 4.0 WPF ...

Je ne fais pas référence à aucune DLL 3ème partie.

Ce sont les assemblages I référence:

Microsoft.cshaarp Présentation.core PrésentationFramework Système System.core System.Data System.xaml System.xml System.xml.ling WindowsBase

Mise à jour 2:

J'ai créé maintenant un projet .NET 4.0 WPF à partir de zéro avec une fenêtre vide et un fond vert; -)

Le démarrage à froid a pris 3 secondes (disque dur a été très occupé)

Puis j'exécute mon autre application WPF qui a pris auparavant 10 secondes. Maintenant, il n'a besoin que de 1,5 seconde pour apparaître à l'écran.

La situation est maintenant claire pour moi:

Mon application comme rien ce qui pourrait le rendre lent. C'est à peu près la première application WPF chargée ou non.

Je pense que je vais le faire comme Adobe Reader. Mettez un accélérateur d'applications ... dans l'autostart étant une petite application WPF Hello World WPF ...


9 commentaires

Vous devriez être plus précis sur ce que votre application fait lors de l'initialisation. Je pourrais écrire une application WPF qui est plus petite et calcule des factoriels lors de l'initialisation - cela commencerait même plus lentement que le vôtre.


@Venemo: Comme je l'ai dit avant que je viens de lier une liste générique de 30 entités codée de 30 entités à un DataGrid. Pas d'accès à la base de données du tout!


Que se passe-t-il si vous prenez DataGrid hors de l'équation ...


L'un des problèmes est le service de cache de police doit démarrer avant que la première application WPF ne démarre.


Essayez une application WPF Hello World WPF (texte simple sur une fenêtre vide) et voyez combien de temps il faut pour démarrer. Si c'est rapide, votre application fait quelque chose de lent, si elle est lente, les libs CLR et WPF sont susceptibles de blâmer.


J'ai mis à jour mon message initial voir ci-dessus!


C'est une des raisons d'une raison comme Adobe Créer des écrans Splash pour leurs applications. Cela ne résout pas le problème, mais cela améliorera les performances perçues.


Eh bien, mon Photoshop ici commence dans les 2 secondes OK Sois un natif .exe ...


Une question à personne n'a encore demandé: "Est-ce qu'il importe si cela prend 10 secondes pour commencer?" ... Si, par exemple, votre application est chargée une fois par semaine et laissée ouverte à partir de là - alors ce n'est probablement pas. Cela vaut-il vraiment la peine de votre temps pour optimiser le temps de démarrage à froid ou existe-t-il quelque chose que vos utilisateurs apprécieraient votre temps passé plus? :)


4 Réponses :


4
votes

Vous pouvez utiliser Ngen à Pré-compiler vos assemblys. Cela devrait aider.

EDIT: Il peut y avoir une chose qui peut aider. S'il s'agit d'une application WPF basée sur le modèle "Nouvelle application WPF" dans Visual Studio, votre application fera référence à une bande d'assemblages que vous ne pouvez pas utiliser. Essayez de supprimer toutes les assemblées inutilisées des références de vos applications et voyez si cela aide.


3 commentaires

Cela pourrait, bien que je pense que tout ou partie du code JIT soit mis en cache sur la première exécution.


Cela devrait, mais la question est de savoir comment faire le démarrage à froid (c'est-à-dire la première fois que l'application est exécutée) plus rapidement. Tant que l'application ne fait pas grand chose au démarrage, je ne pense pas qu'il n'y ait rien d'autre que Ngen qui aidera.


Ngen sur une petite application rend le froid commence plus lentement. Plus gros dll à charger.



1
votes

Ce n'est pas normal, faites-vous des connexions à une base de données ou à un réseau? En attente de la ressource OS?


0 commentaires

1
votes

.NET Les applications commencent lentement par rapport aux applications compilées de manière native, mais cela semble excessive. ProCmon peut offrir un aperçu de ce qu'il attend.


0 commentaires

2
votes

Vous voudrez peut-être jeter un coup d'œil à Ce blog MSDN Post par Jossef Goldberg.


0 commentaires