web-dev-qa-db-fra.com

Comment et quand fonctionne ngen.exe?

Je veux connaître les avantages de la compilation pré-JIT (ngen.exe). Quel est le rôle du processus Native Image Generator (NGen) et pourquoi est-il nécessaire?

Veuillez fournir un exemple.

19
Dhiren

Pour l'exécution de code sur la plate-forme .NET, la représentation Common Intermediate Language (CIL) doit être traduite en code machine. Si cela se produit immédiatement avant l'exécution, on parle de compilation JIT (Just In Time). La sortie de JIT n'est pas persistante, donc votre application gérée doit passer par JIT pour chaque lancement.

Vous pouvez également utiliser la précompilation pour réduire les frais généraux de démarrage liés à la compilation JIT. NGen effectue une précompilation et conserve les images natives dans un cache d'images natives. Ensuite, les applications peuvent s'exécuter avec les images natives et peuvent connaître un temps de démarrage plus rapide en raison de la surcharge de compilation JIT réduite. Au départ, NGen était une technologie au moment de l'installation, les développeurs ont demandé aux installateurs d'applications d'émettre des commandes NGen pour déclencher la pré-compilation pendant le temps d'installation. Pour plus de détails, consultez NGen améliore vos performances avec de nouvelles fonctionnalités puissantes. Cet article fournit un exemple d'application qui exploite NGen.

Avec Windows 8 (.NET 4.5), un nouveau mode NGen: "Auto NGen" a été introduit. Fondamentalement, le runtime .NET génère des journaux d'utilisation pour les applications gérées. Lorsque le système est inactif, une tâche de maintenance automatique s'exécute en arrière-plan et génère des images natives. De cette façon, les développeurs n'ont plus à traiter explicitement avec NGen. Notez que cette fonctionnalité n'est activée que pour les applications .NET 4.5+ qui ciblent Windows Store ou utilisent le GAC . Voici une page MSDN qui peut être utile: Création d'images natives

Et voici un aperçu de haut niveau de NGen et des technologies associées: Vous avez besoin de vitesse? Les applications .NET démarrent plus rapidement

Enfin, les bibliothèques de framework .NET elles-mêmes utilisent NGen pour de meilleures performances. Lorsque le framework .NET est réparé, certaines des images natives sont invalidées. Ensuite, NGen doit s'exécuter pour recréer les images natives non valides. Cela se fait automatiquement via le service .NET Runtime Optimization qui s'exécute pendant le temps d'inactivité.

31
m_eric

.NET compilation flow

Lorsqu'un compilateur .NET compile du code C # ou VB.NET, il les compile à moitié et crée du code CIL . Lorsque vous exécutez ce fichier EXE .NET semi-compilé, le JIT s'exécute en arrière-plan et compile le demi-code CIL en langage machine complet. Ce mode est appelé JIT normal.

Vous pouvez également faire l'inverse en disant que vous ne voulez pas de compilation d'exécution en exécutant un fichier EXE compilé complet. Cette compilation est effectuée à l'aide de negen.exe. Dans ce scénario, le JIT ne participe pas à l'exécution. Ceci est appelé mode pré-JIT.

Si vous voulez voir comment ils affectent les performances, vous pouvez voir cette vidéo YouTube qui montre le mode de compilation normal JIT et pré-JIT:

Expliquez JIT, Ngen.exe, Pre-jit, Normal-Jit et Econo-Jit.? (Questions d'entrevue .NET)

7
Shivprasad Koirala

Par MSDN :

Le générateur d'images natives (Ngen.exe) est un outil qui améliore les performances des applications gérées. Ngen.exe crée des images natives, qui sont des fichiers contenant du code machine compilé spécifique au processeur, et les installe dans le cache d'images natives sur l'ordinateur local. Le runtime peut utiliser des images natives du cache au lieu d'utiliser le compilateur juste à temps (JIT) pour compiler l'assembly d'origine.

J'ai utilisé NGEN dans le passé lors de l'installation pour que le logiciel démarre plus rapidement.

2
BryanJ

NGen (Native Image Generator) compile essentiellement le code d'octets .NET ( CIL ) en code natif pour l'ordinateur sur lequel il fonctionne. L'avantage est que, étant donné que vous ne compilez pas le code en natif à chaque fois, vous l'exécutez ou en avez besoin, mais vous ne le faites qu'une seule fois, l'application démarre et s'exécute plus rapidement. Si vous souhaitez plus d'informations, il existe de nombreuses ressources sur les avantages de JIT par rapport à Ahead of Time Compilation (ce que fait NGen).

1
Rafael