JIT vs NGen – qual è la differenza?

Così, quando CLR runtime caricare un .NET assembly, si compila in macchina in codice nativo. Questo processo è chiamato JITing. NGen è anche il processo di compilazione .NET assembly in codice nativo. Non capisco qual è la differenza tra i due?

InformationsquelleAutor palm snow | 2011-04-02

 

5 Replies
  1. 32

    La differenza è quando si verificano. La compilazione JIT si verifica mentre il programma è in esecuzione. NGen è un fatto, di norma, al momento dell’installazione del programma e succede prima che il programma è in esecuzione. Uno degli obiettivi di NGen è quello di rimuovere il JIT sanzione da avvio dell’applicazione.

    • Che cosa è la necessità di JIT a tutti, quando abbiamo NGEN?
    • la portabilità. Con NGen è necessario pre-compilare il codice per il sistema di destinazione. Con JIT sarà compilato (o finito di compilare) “al volo” durante l’esecuzione, il che significa che si può semplicemente distribuire un file eseguibile e ti eseguire ovunque .NET esegue.
  2. 16

    JIT è fatto solo per metodo, non JIT tutto… Solo i bit di cui hai bisogno. Naturalmente questo è un piccolo, ma misurabile colpito la prima volta in un metodo più generici, ecc). NGEN fa questo lavoro di up-front, ma deve essere fatto sulla stessa piattaforma/architettura ecc, in sostanza che macchina. Questo significa anche aggiungendo al GAC, ecc, che possono avere bisogno di accesso superiore.

    In molti casi, JIT è bene, soprattutto se l’app è aperta per un lungo periodo di tempo (web server, ad esempio).

  3. 9

    Una grande differenza importante, che deve ancora essere menzionato è che i nativi nella cache le immagini sono condivise di pagine di codice’, che fa una differenza enorme nella memoria da parte delle applicazioni in esecuzione su Servizi Terminal o Citrix.

    La cosa più importante da capire circa NGEN è che, mentre si compila il codice, si segna anche il codice delle pagine condivisibili, in modo che più istanze dell’applicazione è possibile condividere parti di spazio di memoria utilizzato dalla prima istanza. E che è veramente utile se si sta eseguendo sotto di Servizi Terminal.

    http://blogs.msdn.com/b/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx.

    Questo ha implicazioni molto importanti per le applicazioni utilizzate da più utenti su una singola macchina che condivide la memoria tra processi. Questo può portare a molto strano, difficile da riprodurre il comportamento e la gestione delle risorse dei problemi se l’immagine in cache non sono ben mantenute.

    • Questo è rilevante se si esegue >100 istanze di lavoro stesso sulla stessa macchina (quando i processi sono da preferire i thread a causa di un migliore isolamento e stabilità).
    • La condivisione della memoria riguardano anche il web, giardini, dove lo stesso sito caricato più volte in separata W3WP.exe i processi. Non JIT ancora non permettere la condivisione della memoria?
    • Davvero, questo beneficio si applica quando, hai un sacco di processi di carico stesso binario (eseguibile o non) sulla stessa CLR con la stessa libreria versioni sulla stessa macchina, non importa il motivo è che li avete.
  4. 7

    Da MSDN…

    Il Generatore di Immagini Native (Ngen.exe) è uno strumento che migliora le prestazioni delle applicazioni gestite. Ngen.exe crea immagini native, che sono file che contengono compilato in codice macchina specifico del processore, e li installa in native image cache sul computer locale. Il runtime è possibile utilizzare le immagini native dalla cache invece di utilizzare il just-in-time (JIT) compilatore per compilare l’assembly originale.

    http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx

    Fondamentalmente NGen consente di pre-JIT e la cache di montaggio sulla macchina locale. Questo consente un avvio più rapido e a volte l’esecuzione.

  5. 3

    Un sacco di dettagli qui, ma:

    Jit non è che… Jit è Just-In-Time, il che significa non avere compilato in codice nativo fino a quando il codice, come un metodo, in realtà è richiamato. Ci sono solo stub fino ad allora. Questo è rimasto nella cache in modo che le successive chiamate al metodo non ri-generare il codice nativo.

    NGen non l’intero gruppo in una sola volta. NGen fa tutto in una volta in modo che Jitting non è necessario.

Lascia un commento