Verbessern der Startleistung mit NGen
Hinweis
Nur EF6 und höher: Die Features, APIs usw., die auf dieser Seite erläutert werden, wurden in Entity Framework 6 eingeführt. Wenn Sie eine frühere Version verwenden, gelten manche Informationen nicht.
.NET Framework unterstützt die Generierung nativer Images für verwaltete Anwendungen und Bibliotheken als Möglichkeit, Anwendungen schneller zu starten und in einigen Fällen auch weniger Arbeitsspeicher zu verwenden. Native Images werden erstellt, indem verwaltete Codeassemblys in Dateien übersetzt werden, die native Computeranweisungen enthalten, bevor die Anwendung ausgeführt wird. Der .NET JIT-Compiler (Just-In-Time) muss die nativen Anweisungen zur Anwendungslaufzeit generieren.
Vor Version 6 waren die Kernbibliotheken der EF-Runtime Teil von .NET Framework, und native Images wurden automatisch dafür generiert. Ab Version 6 wurde die gesamte EF-Runtime im EntityFramework NuGet-Paket kombiniert. Native Images müssen jetzt mit dem Befehlszeilentool „NGen.exe“ generiert werden, um ähnliche Ergebnisse abzurufen.
Empirische Beobachtungen zeigen, dass mit nativen Images der EF-Runtimeassemblys die Anwendung eine bis drei Sekunden schneller startet.
So verwenden Sie „NGen.exe“
Die grundlegendste Funktion des NGen.exe-Tools besteht darin, native Images für eine Assembly und alle direkten Abhängigkeiten zu „installieren“ (d. h. zum Erstellen und Speichern auf dem Datenträger). Hier erfahren Sie, wie:
Öffnen Sie ein Eingabeaufforderungsfenster als ein Administrator.
Ändern Sie das aktuelle Arbeitsverzeichnis in den Speicherort der Assemblys, für die Sie native Images generieren möchten:
cd <*Assemblies location*>
Je nach Betriebssystem und Anwendungskonfiguration müssen Sie möglicherweise native Images für die 32-Bit-Architektur, die 64-Bit-Architektur oder beide generieren.
Für die 32-Bit-Ausführung:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>
Für die 64-Bit-Ausführung:
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>
Tipp
Das Generieren von nativen Images für die falsche Architektur ist ein sehr häufiger Fehler. Im Zweifelsfall können Sie einfach native Images für alle Architekturen generieren, die auf das auf dem Computer installierte Betriebssystem angewendet werden.
„NGen.exe“ unterstützt auch andere Funktionen wie das Deinstallieren und Anzeigen der installierten nativen Images, das Queuing der Generierung mehrerer Images usw. Weitere Informationen zur Nutzung finden Sie in der NGen.exe-Dokumentation.
Wann NGen.exe verwendet wird
Bei der Entscheidung, für welche Assemblys native Images in einer Anwendung basierend auf EF Version 6 oder höher generiert werden sollen, sollten Sie die folgenden Optionen berücksichtigen:
- Die primäre EF-Runtimeassembly „EntityFramework.dll“: Eine typische EF-basierte Anwendung führt beim Start oder beim ersten Zugriff auf die Datenbank eine erhebliche Menge Code aus dieser Assembly aus. Die Erstellung nativer Images aus dieser Assembly zählt daher zu den größten Vorteilen für die Startleistung.
- Jede EF-Anbieterassembly, die von Ihrer Anwendung verwendet wird: Die Startzeit kann auch etwas von der Generierung nativer Images von dieser profitieren. Wenn die Anwendung beispielsweise den EF-Anbieter für SQL Server verwendet, sollten Sie ein natives Image für „EntityFramework.SqlServer.dll“ generieren.
- Die Assemblys Ihrer Anwendung und andere Abhängigkeiten: Die NGen.exe-Dokumentation umfasst allgemeine Kriterien für die Auswahl der Assemblys, für die native Images generiert werden sollen, sowie die Auswirkungen nativer Images auf die Sicherheit, erweiterte Optionen wie „feste Bindung“, Szenarios wie die Verwendung nativer Images in Debug- und Profilerstellungsszenarios usw.
Tipp
Stellen Sie sicher, dass Sie die Auswirkungen der Verwendung nativer Images sowohl auf die Startleistung als auch auf die Gesamtleistung Ihrer Anwendung sorgfältig messen und mit tatsächlichen Anforderungen vergleichen. Native Images helfen zwar im Allgemeinen, die Leistung beim Start zu verbessern und in einigen Fällen die Speicherauslastung zu verringern, aber nicht alle Szenarios profitieren gleichermaßen. Beispielsweise kann bei der Ausführung des stabilen Zustands (d. h., nachdem alle von der Anwendung verwendeten Methoden mindestens einmal aufgerufen wurden) Code, der vom JIT-Compiler generiert wird, eine etwas bessere Leistung als native Images bieten.
Verwenden von „NGen.exe“ auf einem Entwicklungscomputer
Während der Entwicklung geht der .NET JIT-Compiler den besten gängigen Kompromiss für Code ein, der sich häufig ändert. Das Generieren nativer Images für kompilierte Abhängigkeiten wie die EF-Runtimeassemblys kann dazu beitragen, die Entwicklung und Tests zu beschleunigen, indem zu Beginn jeder Ausführung einige Sekunden eingespart werden.
Ein guter Ort, um die EF-Runtimeassemblys zu suchen, ist der NuGet-Paketspeicherort für die Lösung. Beispielsweise können Sie für eine Anwendung, die EF 6.0.2 mit SQL Server verwendet und auf .NET 4.5 oder höher ausgerichtet ist, Folgendes in ein Eingabeaufforderungsfenster eingeben (denken Sie daran, dieses als Administrator zu öffnen):
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
Hinweis
Hierbei wird davon profitiert, dass die Installation der nativen Images für den EF-Anbieter für SQL Server standardmäßig auch die nativen Images für die primäre EF-Runtimeassembly installiert. Dies funktioniert, da „NGen.exe“ erkennen kann, dass „EntityFramework.dll“ eine direkte Abhängigkeit der EntityFramework.SqlServer.dll-Assembly im selben Verzeichnis ist.
Erstellen nativer Images während des Setups
Das WiX-Toolkit unterstützt das Queuing der Generierung nativer Images für verwaltete Assemblys während des Setups, wie in dieser Schrittanleitung erläutert. Eine weitere Alternative besteht darin, eine benutzerdefinierte Setupaufgabe zu erstellen, die den Befehl „NGen.exe“ ausführt.
Überprüfen, ob native Images für EF verwendet werden
Sie können überprüfen, ob eine bestimmte Anwendung eine native Assembly verwendet, indem Sie nach geladenen Assemblys suchen, die die Erweiterung „.ni.dll“ oder „.ni.exe“ aufweisen. Beispielsweise wird ein natives Image für die primäre EF-Runtimeassembly als „EntityFramework.ni.dll“ bezeichnet. Eine einfache Möglichkeit zum Überprüfen der geladenen .NET-Assemblys eines Prozesses ist die Verwendung des Prozess-Explorers.
Was Sie noch beachten müssen
Das Erstellen eines nativen Images einer Assembly darf nicht mit der Registrierung der Assembly im GAC (Globaler Assemblycache) verwechselt werden. „NGen.exe“ ermöglicht das Erstellen von Images von Assemblys, die sich nicht im globalen Assemblycache befinden, und tatsächlich können mehrere Anwendungen, die eine bestimmte Version von EF verwenden, dasselbe native Image verwenden. Windows 8 kann zwar automatisch native Images für Assemblys erstellen, die im globalen Assemblycache platziert werden, die EF-Runtime ist jedoch für die Bereitstellung zusammen mit Ihrer Anwendung optimiert, und es wird nicht empfohlen, sie im globalen Assemblycache zu registrieren, da dies unter anderem negative Auswirkungen auf die Assemblyauflösung und die Wartung Ihrer Anwendungen hat.