Zlepšení výkonu při spuštění pomocí NGen
Poznámka
Pouze EF6 a novější – Funkce, rozhraní API atd. popsané na této stránce byly představeny v Entity Framework 6. Pokud používáte starší verzi, některé nebo všechny informace nemusí být platné.
Rozhraní .NET Framework podporuje generování nativních imagí pro spravované aplikace a knihovny jako způsob, jak aplikacím pomoct rychleji spouštět a v některých případech také používat méně paměti. Nativní bitové kopie se vytvářejí tak, že přeloží sestavení spravovaného kódu do souborů obsahujících instrukce nativního počítače před spuštěním aplikace, přičemž kompilátor JIT (Just-In-Time) bude muset vygenerovat nativní instrukce za běhu aplikace.
Před verzí 6 byly základní knihovny modulu RUNTIME EF součástí rozhraní .NET Framework a nativní bitové kopie se pro ně automaticky vygenerovaly. Od verze 6 se celý modul runtime EF zkombinoval do balíčku NuGet EntityFramework. Nativní bitové kopie musí být nyní generovány pomocí nástroje příkazového řádku NGen.exe k získání podobných výsledků.
Empirické pozorování ukazují, že nativní bitové kopie sestavení modulu runtime EF mohou vyjmout mezi 1 a 3 sekundami doby spuštění aplikace.
Jak používat NGen.exe
Nejzákladnější funkcí nástroje NGen.exe je "install" (to znamená vytvořit a zachovat na disku) nativní bitové kopie pro sestavení a všechny jeho přímé závislosti. Tady je postup, jak toho dosáhnout:
Otevřete okno příkazového řádku jako správce.
Změňte aktuální pracovní adresář na umístění sestavení, pro která chcete generovat nativní bitové kopie:
cd <*Assemblies location*>
V závislosti na operačním systému a konfiguraci aplikace možná budete muset generovat nativní bitové kopie pro 32bitovou architekturu, 64bitovou architekturu nebo obojí.
Pro 32bitové spuštění:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>
Pro 64bitové spuštění:
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>
Tip
Generování nativních imagí pro nesprávnou architekturu je velmi běžnou chybou. Pokud máte pochybnosti, můžete jednoduše vygenerovat nativní bitové kopie pro všechny architektury, které platí pro operační systém nainstalovaný v počítači.
NGen.exe také podporuje další funkce, jako je odinstalace a zobrazení nainstalovaných nativních bitových kopií, řazení do fronty generace více imagí atd. Další podrobnosti o využití naleznete v dokumentaci NGen.exe.
Kdy použít NGen.exe
Pokud se chcete rozhodnout, pro která sestavení se mají v aplikaci generovat nativní bitové kopie na základě EF verze 6 nebo vyšší, měli byste zvážit následující možnosti:
- Hlavní sestavení modulu runtime EF, EntityFramework.dll: Typická aplikace založená na ef spouští značné množství kódu z tohoto sestavení při spuštění nebo při prvním přístupu k databázi. Vytváření nativních imagí tohoto sestavení proto přinese největší nárůst výkonu při spuštění.
- Jakékoli sestavení zprostředkovatele EF, které vaše aplikace používá: Čas spuštění může také mírně těžit z generování nativních imagí z těchto. Pokud například aplikace používá zprostředkovatele EF pro SQL Server, budete chtít vygenerovat nativní image pro EntityFramework.SqlServer.dll.
- Sestavení a další závislosti vaší aplikace: Dokumentace NGen.exe popisuje obecná kritéria pro výběr sestavení pro generování nativních bitových kopií a dopad nativních bitových kopií na zabezpečení, pokročilé možnosti, například "pevné vazby", scénáře, jako je použití nativních imagí ve scénářích ladění a profilace atd.
Tip
Ujistěte se, že pečlivě změříte dopad používání nativních imagí na výkon při spuštění i na celkový výkon aplikace a porovnáte je se skutečnými požadavky. I když nativní bitové kopie obecně pomáhají zlepšit výkon při spuštění a v některých případech snížit využití paměti, ne všechny scénáře budou mít stejné výhody. Například při provádění stabilního stavu (to znamená, že jakmile jsou všechny metody používané aplikací vyvolány alespoň jednou) kód vygenerovaný kompilátorem JIT může ve skutečnosti přinést mírně lepší výkon než nativní bitové kopie.
Použití NGen.exe ve vývojovém počítači
Během vývoje bude kompilátor JIT .NET nabízet nejlepší celkový kompromis pro kód, který se často mění. Generování nativních imagí pro kompilované závislosti, jako jsou sestavení modulu runtime EF, může pomoct zrychlit vývoj a testování tím, že na začátku každého spuštění vyřízne několik sekund.
Vhodným místem pro nalezení sestavení modulu runtime EF je umístění balíčku NuGet pro řešení. Například pro aplikaci používající EF 6.0.2 s SQL Serverem a cílením na .NET 4.5 nebo novější můžete do okna příkazového řádku zadat následující údaje (nezapomeňte ho otevřít jako správce):
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
Poznámka
To využívá skutečnost, že instalace nativních imagí pro poskytovatele EF pro SQL Server také ve výchozím nastavení nainstaluje nativní bitové kopie pro hlavní sestavení modulu runtime EF. To funguje, protože NGen.exe dokáže zjistit, že EntityFramework.dll je přímá závislost EntityFramework.SqlServer.dll sestavení umístěné ve stejném adresáři.
Vytváření nativních imagí během instalace
Sada WiX Toolkit podporuje řazení nativních imagí do fronty pro spravovaná sestavení během instalace, jak je vysvětleno v tomto návodu. Další alternativou je vytvoření vlastní úlohy instalace, která spustí příkaz NGen.exe.
Ověření, že se pro EF používají nativní bitové kopie
Zadáním načtených sestavení, která mají příponu .ni.dll nebo .ni.exe, můžete ověřit, zda konkrétní aplikace používá nativní sestavení. Například nativní image pro sestavení hlavního modulu runtime EF se bude jmenovat EntityFramework.ni.dll. Snadný způsob, jak zkontrolovat načtená sestavení .NET procesu, je použít Průzkumníka procesů.
Další věci, o které je potřeba vědět
Vytvoření nativní image sestavení by nemělo být zaměňováno s registrací sestavení v GAC (Global Assembly Cache). NGen.exe umožňuje vytvářet image sestavení, která nejsou v GAC, a ve skutečnosti více aplikací, které používají konkrétní verzi EF mohou sdílet stejnou nativní image. I když systém Windows 8 může automaticky vytvářet nativní bitové kopie pro sestavení umístěná v GAC, je modul runtime EF optimalizovaný tak, aby byl nasazen společně s vaší aplikací, a nedoporučujeme ho registrovat v GAC, protože to má negativní dopad na rozlišení sestavení a údržbu aplikací mimo jiné.