Udostępnij za pośrednictwem


Zwiększanie wydajności uruchamiania za pomocą narzędzia NGen

Uwaga

Tylko rozwiązanie EF6 i nowsze wersje — Funkcje, interfejsy API itp. omówione na tej stronie zostały wprowadzone w rozwiązaniu Entity Framework 6. Jeśli korzystasz ze starszej wersji, niektóre lub wszystkie podane informacje nie mają zastosowania.

Program .NET Framework obsługuje generowanie obrazów natywnych dla zarządzanych aplikacji i bibliotek jako sposób na szybsze uruchamianie aplikacji, a także w niektórych przypadkach używa mniej pamięci. Obrazy natywne są tworzone przez tłumaczenie zarządzanych zestawów kodu na pliki zawierające instrukcje maszyny natywnej przed wykonaniem aplikacji, co powoduje usunięcie kompilatora JIT platformy .NET (Just In Time) z konieczności wygenerowania natywnych instrukcji w środowisku uruchomieniowym aplikacji.

Przed wersją 6 podstawowe biblioteki środowiska uruchomieniowego EF były częścią programu .NET Framework, a obrazy natywne zostały wygenerowane automatycznie. Począwszy od wersji 6 całe środowisko uruchomieniowe EF zostało połączone z pakietem NuGet EntityFramework. Obrazy natywne muszą być teraz generowane przy użyciu narzędzia wiersza polecenia NGen.exe, aby uzyskać podobne wyniki.

Obserwacje empiryczne pokazują, że natywne obrazy zestawów środowiska uruchomieniowego EF mogą skrócić czas uruchamiania aplikacji z zakresu od 1 do 3 sekund.

Jak używać pliku NGen.exe

Najbardziej podstawową funkcją narzędzia NGen.exe jest "instalowanie" (czyli tworzenie i utrwalanie na dysku) obrazów natywnych dla zestawu i wszystkich jego bezpośrednich zależności. Oto jak można to osiągnąć:

  1. Otwórz okno wiersza polecenia jako administrator.

  2. Zmień bieżący katalog roboczy na lokalizację zestawów, dla których chcesz wygenerować obrazy natywne:

    cd <*Assemblies location*>  
    
  3. W zależności od systemu operacyjnego i konfiguracji aplikacji może być konieczne wygenerowanie obrazów natywnych dla architektury 32-bitowej, architektury 64-bitowej lub obu tych elementów.

    W przypadku uruchomienia 32-bitowego:

    %WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>  
    

    W przypadku uruchomienia 64-bitowego:

    %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>  
    

Napiwek

Generowanie obrazów natywnych dla niewłaściwej architektury jest bardzo częstym błędem. Jeśli masz wątpliwości, możesz po prostu wygenerować obrazy natywne dla wszystkich architektur, które mają zastosowanie do systemu operacyjnego zainstalowanego na maszynie.

Program NGen.exe obsługuje również inne funkcje, takie jak odinstalowywanie i wyświetlanie zainstalowanych obrazów natywnych, kolejkowanie generowania wielu obrazów itp. Aby uzyskać więcej informacji na temat użycia, zapoznaj się z dokumentacją NGen.exe.

Kiedy należy używać pliku NGen.exe

Jeśli chodzi o podjęcie decyzji, które zestawy mają generować obrazy natywne dla aplikacji w oparciu o wersję 6 lub nowszą, należy wziąć pod uwagę następujące opcje:

  • Główny zestaw środowiska uruchomieniowego EF, EntityFramework.dll: typowa aplikacja oparta na platformie EF wykonuje znaczną ilość kodu z tego zestawu podczas uruchamiania lub pierwszego dostępu do bazy danych. W związku z tym utworzenie obrazów natywnych tego zestawu spowoduje największe wzrosty wydajności uruchamiania.
  • Dowolny zestaw dostawcy EF używany przez aplikację: czas uruchamiania może również nieznacznie korzystać z generowania obrazów natywnych tych elementów. Jeśli na przykład aplikacja używa dostawcy EF dla programu SQL Server, chcesz wygenerować obraz natywny dla biblioteki EntityFramework.SqlServer.dll.
  • Zestawy aplikacji i inne zależności: dokumentacja NGen.exe obejmuje ogólne kryteria wyboru zestawów do generowania obrazów natywnych dla i wpływu obrazów natywnych na zabezpieczenia, zaawansowanych opcji, takich jak "twarde powiązanie", takich jak używanie obrazów natywnych w scenariuszach debugowania i profilowania itp.

Napiwek

Upewnij się, że dokładnie zmierzysz wpływ używania obrazów natywnych zarówno na wydajność uruchamiania, jak i ogólną wydajność aplikacji, a następnie porównaj je z rzeczywistymi wymaganiami. Obrazy natywne zwykle pomagają poprawić wydajność uruchamiania i w niektórych przypadkach zmniejszyć użycie pamięci, ale nie wszystkie scenariusze będą równie korzystne. Na przykład w przypadku wykonywania stanu stałego (czyli po wywołaniu co najmniej raz wszystkich metod używanych przez aplikację) kod wygenerowany przez kompilator JIT może w rzeczywistości uzyskać nieco lepszą wydajność niż obrazy natywne.

Używanie pliku NGen.exe na maszynie dewelopera

Podczas programowania kompilator JIT platformy .NET będzie oferować najlepszy ogólny kompromis dla kodu, który często się zmienia. Generowanie obrazów natywnych dla skompilowanych zależności, takich jak zestawy środowiska uruchomieniowego EF, może pomóc przyspieszyć opracowywanie i testowanie, wycinając kilka sekund na początku każdego wykonania.

Dobrym miejscem do znalezienia zestawów środowiska uruchomieniowego EF jest lokalizacja pakietu NuGet dla rozwiązania. Na przykład w przypadku aplikacji korzystającej z programu EF 6.0.2 z programem SQL Server i przeznaczonej dla platformy .NET 4.5 lub nowszej można wpisać następujące polecenie w oknie wiersza polecenia (pamiętaj, aby otworzyć go jako administrator):

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

Uwaga

Wykorzystuje to fakt, że zainstalowanie obrazów natywnych dla dostawcy programu EF dla programu SQL Server domyślnie spowoduje również zainstalowanie obrazów natywnych dla głównego zestawu środowiska uruchomieniowego EF. Działa to, ponieważ plik NGen.exe może wykryć, że entityFramework.dll jest bezpośrednią zależnością zestawu EntityFramework.SqlServer.dll znajdującego się w tym samym katalogu.

Tworzenie obrazów natywnych podczas instalacji

Zestaw narzędzi WiX umożliwia kolejkowanie generowania obrazów natywnych dla zestawów zarządzanych podczas instalacji, jak wyjaśniono w tym przewodniku z instrukcjami. Inną alternatywą jest utworzenie niestandardowego zadania instalacyjnego, które wykonuje polecenie NGen.exe.

Sprawdzanie, czy obrazy natywne są używane na potrzeby programu EF

Możesz sprawdzić, czy określona aplikacja używa zestawu natywnego, wyszukując załadowane zestawy z rozszerzeniem ".ni.dll" lub ".ni.exe". Na przykład obraz macierzysty głównego zestawu środowiska uruchomieniowego ef będzie nosił nazwę EntityFramework.ni.dll. Łatwym sposobem sprawdzenia załadowanych zestawów platformy .NET procesu jest użycie Eksploratora procesów.

Inne kwestie, o których należy pamiętać

Tworzenie obrazu natywnego zestawu nie powinno być mylone z rejestrowaniem zestawu w pamięci podręcznej zestawów GAC (globalna pamięć podręczna zestawów). Program NGen.exe umożliwia tworzenie obrazów zestawów, które nie znajdują się w GAC, a w rzeczywistości wiele aplikacji korzystających z określonej wersji programu EF może współużytkować ten sam obraz macierzysty. Chociaż system Windows 8 może automatycznie tworzyć obrazy natywne dla zestawów umieszczonych w GAC, środowisko uruchomieniowe EF jest zoptymalizowane pod kątem wdrażania wraz z aplikacją i nie zalecamy rejestrowania go w GAC, ponieważ ma to negatywny wpływ na rozpoznawanie zestawów i obsługę aplikacji między innymi aspektami.