Partager via


Amélioration des performances de démarrage avec NGen

Remarque

EF6 et versions ultérieures uniquement : Les fonctionnalités, les API, etc. décrites dans cette page ont été introduites dans Entity Framework 6. Si vous utilisez une version antérieure, certaines ou toutes les informations ne s’appliquent pas.

Le .NET Framework prend en charge la génération d’images natives pour les applications managées et les bibliothèques afin d’aider les applications à démarrer plus rapidement et, dans certains cas, à utiliser moins de mémoire. Les images natives sont créées en convertissant des assemblys de code managé en fichiers contenant des instructions natives de la machine avant que l’application ne soit exécutée, ce qui permet au compilateur .NET JIT (juste-à-temps) de générer les instructions natives au moment de l’exécution de l’application.

Avant la version 6, les bibliothèques principales du runtime EF faisaient partie du .NET Framework et des images natives étaient générées automatiquement pour elles. À compter de la version 6, l’ensemble du runtime EF a été combiné dans le package NuGet d’EntityFramework. Les images natives doivent maintenant être générées à l’aide de l’outil en ligne de commande NGen.exe pour obtenir des résultats similaires.

Les observations empiriques montrent que les images natives des assemblys d’exécution EF peuvent couper entre 1 et 3 secondes de temps de démarrage de l’application.

Comment utiliser Ngen.exe

La fonction la plus simple de l’outil NGen.exe consiste à « installer » (c’est-à-dire à créer et à stocker sur le disque) des images natives pour un assembly et toutes ses dépendances directes. Voici comment procéder :

  1. Ouvrez une fenêtre d’invite de commandes en tant qu’administrateur.

  2. Remplacez le répertoire de travail actuel par l’emplacement des assemblys pour lesquels vous souhaitez générer des images natives :

    cd <*Assemblies location*>  
    
  3. Selon votre système d’exploitation et la configuration de l’application, vous devrez peut-être générer des images natives pour l’architecture 32 bits, l’architecture 64 bits ou les deux.

    Pour l’exécution 32 bits :

    %WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>  
    

    Pour l’exécution 64 bits :

    %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>  
    

Conseil

La génération d’images natives pour une architecture incorrecte est une erreur très courante. En cas de doute, vous pouvez simplement générer des images natives pour toutes les architectures qui s’appliquent au système d’exploitation installé sur la machine.

NGen.exe prend également en charge d’autres fonctions telles que la désinstallation et l’affichage des images natives installées, la mise en file d’attente de la génération de plusieurs images, etc. Pour plus d’informations sur l’utilisation, consultez la documentation NGen.exe.

Quand utiliser Ngen.exe

Lorsqu’il s’agit de décider pour quelles assemblies générer des images natives dans une application basée sur EF version 6 ou supérieure, vous devez prendre en compte les options suivantes :

  • L’assembly principal du runtime EF, EntityFramework.dll : une application basée sur EF classique exécute une quantité importante de code à partir de cet assembly au démarrage ou lors de son premier accès à la base de données. Par conséquent, la création d’images natives de cet assembly génère les gains les plus importants en matière de performances de démarrage.
  • N’importe quel assembly de fournisseur EF utilisé par votre application : le temps de démarrage peut également bénéficier légèrement de la génération d’images natives de ceux-ci. Par exemple, si l’application utilise le fournisseur EF pour SQL Server, vous voudrez générer une image native pour EntityFramework.SqlServer.dll.
  • Les assemblys de votre application et autres dépendances : la documentation NGen.exe couvre les critères généraux de choix des assemblys pour lesquels générer des images natives, ainsi que l’impact des images natives sur la sécurité, les options avancées telles que le « hard binding », les scénarios tels que l’utilisation d’images natives dans les scénarios de débogage et de profilage, etc.

Conseil

Veillez à mesurer soigneusement l’impact de l’utilisation d’images natives sur les performances de démarrage et les performances globales de votre application, et de les comparer aux exigences réelles. Bien que les images natives aident généralement à améliorer les performances de démarrage et, dans certains cas, à réduire l’utilisation de la mémoire, tous les scénarios n’en bénéficieront pas de la même manière. Par exemple, lors de l’exécution à l’état stable (autrement dit, une fois que toutes les méthodes utilisées par l’application ont été appelées au moins une fois), le code généré par le compilateur JIT peut en fait obtenir des performances légèrement meilleures que les images natives.

Utilisation de NGen.exe sur une machine de développement

Pendant le développement, le compilateur JIT .NET offre le meilleur compromis global pour le code qui change fréquemment. La génération d’images natives pour les dépendances compilées telles que les assemblys d’exécution EF peut aider à accélérer le développement et les tests en réduisant de quelques secondes le début de chaque exécution.

Un bon endroit pour trouver les assemblys d’exécution EF est l’emplacement du package NuGet pour la solution. Par exemple, pour une application utilisant EF 6.0.2 avec SQL Server et ciblant .NET 4.5 ou version ultérieure, vous pouvez taper ce qui suit dans une fenêtre d’invite de commandes (n’oubliez pas de l’ouvrir en tant qu’administrateur) :

cd <Solution directory>\packages\EntityFramework.6.0.2\lib\net45
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install EntityFramework.SqlServer.dll
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install EntityFramework.SqlServer.dll

Remarque

Cette action profite du fait que l’installation des images natives pour le fournisseur EF pour SQL Server installe également les images natives pour l’assembly d’exécution principal d’EF. Cela fonctionne, car NGen.exe peut détecter qu’EntityFramework.dll est une dépendance directe de l’assembly EntityFramework.SqlServer.dll situé dans le même répertoire.

Création d’images natives lors de l’installation

La boîte à outils WiX prend en charge la mise en file d’attente de la génération d’images natives pour les assemblys managés lors de l’installation, comme expliqué dans ce guide pratique. Une autre alternative consiste à créer une tâche d’installation personnalisée qui exécute la commande NGen.exe.

Vérification de l’utilisation d’images natives pour EF

Vous pouvez vérifier qu’une application spécifique utilise un assembly natif en recherchant des assemblys chargés qui ont l’extension “.ni.dll” ou “.ni.exe”. Par exemple, une image native pour l’assembly principal d’EF sera appelée EntityFramework.ni.dll. Un moyen simple d’inspecter les assemblys .NET chargés d’un processus consiste à utiliser l’Explorateur de processus.

Autres éléments à prendre en compte

La création d’une image native d’un assembly ne doit pas être confondue avec l’inscription de l’assembly dans le GAC (Global Assembly Cache). NGen.exe permet de créer des images d’assemblys qui ne se trouvent pas dans le GAC et en fait, plusieurs applications qui utilisent une version spécifique d’EF peuvent partager la même image native. Même si Windows 8 peut créer automatiquement des images natives pour les assemblys placés dans le GAC, le runtime EF est optimisé pour être déployé en même temps que votre application. Nous vous déconseillons de l’inscrire dans le GAC, car cela a un impact négatif sur la résolution des assemblys et la maintenance de vos applications entre autres aspects.