Miglioramento delle prestazioni di avvio con NGen
Nota
Solo EF6 e versioni successive: funzionalità, API e altri argomenti discussi in questa pagina sono stati introdotti in Entity Framework 6. Se si usa una versione precedente, le informazioni qui riportate, o parte di esse, non sono applicabili.
.NET Framework supporta la generazione di immagini native per applicazioni e librerie gestite come modo per velocizzare l'avvio delle applicazioni e anche in alcuni casi usare meno memoria. Le immagini native vengono create convertendo assembly di codice gestito in file contenenti istruzioni native del computer prima dell'esecuzione dell'applicazione, consentendo al compilatore JIT .NET (Just-In-Time) di generare le istruzioni native in fase di esecuzione dell'applicazione.
Prima della versione 6, le librerie principali del runtime di Entity Framework facevano parte di .NET Framework e le immagini native venivano generate automaticamente per loro. A partire dalla versione 6, l'intero runtime ef è stato combinato nel pacchetto NuGet EntityFramework. Le immagini native devono ora essere generate usando lo strumento da riga di comando NGen.exe per ottenere risultati simili.
Le osservazioni empiriche mostrano che le immagini native degli assembly di runtime ef possono essere tagliate tra 1 e 3 secondi di tempo di avvio dell'applicazione.
Come usare NGen.exe
La funzione più semplice dello strumento NGen.exe consiste nell'"installare" (ovvero per creare e rendere persistenti su disco) immagini native per un assembly e tutte le relative dipendenze dirette. Ecco come ottenere questo risultato:
Aprire una finestra Prompt dei comandi come amministratore.
Modificare la directory di lavoro corrente nel percorso degli assembly per cui si desidera generare immagini native per:
cd <*Assemblies location*>
A seconda del sistema operativo e della configurazione dell'applicazione, potrebbe essere necessario generare immagini native per l'architettura a 32 bit, l'architettura a 64 bit o entrambi.
Per l'esecuzione a 32 bit:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>
Per l'esecuzione a 64 bit:
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>
Suggerimento
La generazione di immagini native per l'architettura errata è un errore molto comune. In caso di dubbi, è sufficiente generare immagini native per tutte le architetture che si applicano al sistema operativo installato nel computer.
NGen.exe supporta anche altre funzioni, ad esempio la disinstallazione e la visualizzazione delle immagini native installate, l'accodamento della generazione di più immagini e così via. Per altri dettagli sull'utilizzo, vedere la documentazione di NGen.exe.
Quando usare NGen.exe
Quando si tratta di decidere quali assembly generare immagini native per in un'applicazione basata su EF versione 6 o successiva, è consigliabile prendere in considerazione le opzioni seguenti:
- L'assembly di runtime ef principale, EntityFramework.dll: una tipica applicazione basata su ENTITY Framework esegue una quantità significativa di codice da questo assembly all'avvio o al primo accesso al database. Di conseguenza, la creazione di immagini native di questo assembly produrrà i maggiori miglioramenti nelle prestazioni di avvio.
- Qualsiasi assembly del provider EF usato dall'applicazione: il tempo di avvio può anche trarre vantaggio dalla generazione di immagini native di queste. Ad esempio, se l'applicazione usa il provider EF per SQL Server, è necessario generare un'immagine nativa per EntityFramework.SqlServer.dll.
- Assembly dell'applicazione e altre dipendenze: la documentazione di NGen.exe illustra i criteri generali per la scelta degli assembly per cui generare immagini native e l'impatto delle immagini native in termini di sicurezza, opzioni avanzate come "hard binding", scenari come l'uso di immagini native negli scenari di debug e profilatura e così via.
Suggerimento
Assicurarsi di misurare attentamente l'impatto dell'uso di immagini native sia sulle prestazioni di avvio che sulle prestazioni complessive dell'applicazione e confrontarle con i requisiti effettivi. Anche se le immagini native consentono in genere di migliorare le prestazioni di avvio e in alcuni casi ridurre l'utilizzo della memoria, non tutti gli scenari trarranno vantaggio altrettanto. Ad esempio, durante l'esecuzione dello stato stabile (ovvero, una volta richiamati almeno una volta tutti i metodi usati dall'applicazione) il codice generato dal compilatore JIT può infatti offrire prestazioni leggermente migliori rispetto alle immagini native.
Uso di NGen.exe in un computer di sviluppo
Durante lo sviluppo, il compilatore JIT .NET offrirà il miglior compromesso generale per il codice che cambia di frequente. La generazione di immagini native per le dipendenze compilate, ad esempio gli assembly di runtime di EF, consente di accelerare lo sviluppo e il test riducendo alcuni secondi all'inizio di ogni esecuzione.
Un buon punto di riferimento per trovare gli assembly di runtime di Entity Framework è il percorso del pacchetto NuGet per la soluzione. Ad esempio, per un'applicazione che usa EF 6.0.2 con SQL Server e che ha come destinazione .NET 4.5 o versione successiva, è possibile digitare quanto segue in una finestra del prompt dei comandi (ricordarsi di aprirla come amministratore):
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
Nota
Ciò sfrutta il fatto che l'installazione delle immagini native per il provider EF per SQL Server installerà anche le immagini native per l'assembly di runtime ef principale. Ciò funziona perché NGen.exe può rilevare che EntityFramework.dll è una dipendenza diretta dell'assembly EntityFramework.SqlServer.dll che si trova nella stessa directory.
Creazione di immagini native durante l'installazione
WiX Toolkit supporta l'accodamento delle immagini native per gli assembly gestiti durante l'installazione, come illustrato in questa guida pratica. Un'altra alternativa consiste nel creare un'attività di installazione personalizzata che esegue il comando NGen.exe.
Verifica dell'uso di immagini native per Entity Framework
È possibile verificare che un'applicazione specifica usi un assembly nativo cercando assembly caricati con estensione ".ni.dll" o ".ni.exe". Ad esempio, un'immagine nativa per l'assembly di runtime principale di EntityFramework.ni.dll di EntityFramework. Un modo semplice per esaminare gli assembly .NET caricati di un processo consiste nell'usare Esplora processi.
Altre cose di cui tenere conto
La creazione di un'immagine nativa di un assembly non deve essere confusa con la registrazione dell'assembly nella GAC (Global Assembly Cache). NGen.exe consente di creare immagini di assembly che non si trovano nella GAC e, infatti, più applicazioni che usano una versione specifica di ENTITY possono condividere la stessa immagine nativa. Anche se Windows 8 può creare automaticamente immagini native per gli assembly inseriti nella GAC, il runtime di Entity Framework è ottimizzato per essere distribuito insieme all'applicazione e non è consigliabile registrarlo nella GAC perché questo ha un impatto negativo sulla risoluzione degli assembly e sulla manutenzione delle applicazioni tra gli altri aspetti.