Opcje konfiguracji środowiska uruchomieniowego na potrzeby kompilacji

W tym artykule szczegółowo przedstawiono ustawienia, których można użyć do skonfigurowania kompilacji platformy .NET.

Uwaga

Program .NET 6 standardizuje prefiks DOTNET_ zamiast COMPlus_ zmiennych środowiskowych, które konfigurują zachowanie czasu wykonywania platformy .NET. COMPlus_ Jednak prefiks będzie nadal działać. Jeśli używasz poprzedniej wersji środowiska uruchomieniowego platformy .NET, nadal należy użyć prefiksu COMPlus_ dla zmiennych środowiskowych.

Kompilacja warstwowa

  • Określa, czy kompilator just in time (JIT) używa kompilacji warstwowej. Metody przejścia kompilacji warstwowej za pośrednictwem dwóch warstw:
    • Pierwsza warstwa szybciej generuje kod (szybki dostęp JIT) lub ładuje wstępnie skompilowany kod (ReadyToRun).
    • Druga warstwa generuje zoptymalizowany kod w tle ("optymalizacja trybu JIT").
  • W programie .NET Core 3.0 lub nowszym kompilacja warstwowa jest domyślnie włączona.
  • W programie .NET Core 2.1 i 2.2 kompilacja warstwowa jest domyślnie wyłączona.
  • Aby uzyskać więcej informacji, zobacz przewodnik kompilacji warstwowej.
Nazwa ustawienia Wartości
runtimeconfig.json System.Runtime.TieredCompilation true -Włączone
false -Wyłączone
Właściwość MSBuild TieredCompilation true -Włączone
false -Wyłączone
Zmienna środowiskowa COMPlus_TieredCompilation lub DOTNET_TieredCompilation 1 -Włączone
0 -Wyłączone

Przykłady

plik runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation": false
      }
   }
}

plik runtimeconfig.template.json:

{
   "configProperties": {
      "System.Runtime.TieredCompilation": false
   }
}

Plik projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredCompilation>false</TieredCompilation>
  </PropertyGroup>

</Project>

Szybki dostęp JIT

  • Określa, czy kompilator JIT używa szybkiego trybu JIT. W przypadku metod, które nie zawierają pętli i dla których wstępnie skompilowany kod jest niedostępny, szybkie kompilowanie ich JIT jest szybsze, ale bez optymalizacji.
  • Włączenie szybkiego trybu JIT zmniejsza czas uruchamiania, ale może generować kod o obniżonej wydajności. Na przykład kod może używać większej ilości miejsca na stosie, przydzielić więcej pamięci i działać wolniej.
  • Jeśli szybki dostęp JIT jest wyłączony, ale kompilacja warstwowa jest włączona, tylko wstępnie skompilowany kod uczestniczy w kompilacji warstwowej. Jeśli metoda nie jest wstępnie skompilowana z funkcją ReadyToRun, zachowanie trybu JIT jest takie samo, jak w przypadku wyłączenia kompilacji warstwowej.
  • W programie .NET Core 3.0 lub nowszym szybki dostęp JIT jest domyślnie włączony.
  • W programach .NET Core 2.1 i 2.2 szybkie JIT jest domyślnie wyłączone.
Nazwa ustawienia Wartości
runtimeconfig.json System.Runtime.TieredCompilation.QuickJit true -Włączone
false -Wyłączone
Właściwość MSBuild TieredCompilationQuickJit true -Włączone
false -Wyłączone
Zmienna środowiskowa COMPlus_TC_QuickJit lub DOTNET_TC_QuickJit 1 -Włączone
0 -Wyłączone

Przykłady

plik runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation.QuickJit": false
      }
   }
}

plik runtimeconfig.template.json:

{
   "configProperties": {
      "System.Runtime.TieredCompilation.QuickJit": false
   }
}

Plik projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredCompilationQuickJit>false</TieredCompilationQuickJit>
  </PropertyGroup>

</Project>

Szybki dostęp JIT dla pętli

  • Określa, czy kompilator JIT używa szybkiego trybu JIT w metodach zawierających pętle.
  • Włączenie szybkiego trybu JIT dla pętli może zwiększyć wydajność uruchamiania. Jednak długotrwałe pętle mogą utknąć w mniej zoptymalizowanym kodzie przez długi czas.
  • Jeśli szybki dostęp JIT jest wyłączony, to ustawienie nie ma żadnego wpływu.
  • Jeśli to ustawienie zostanie pominięte, szybki dostęp JIT nie jest używany w przypadku metod zawierających pętle. Jest to równoważne ustawieniu wartości na false.
Nazwa ustawienia Wartości
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false -Wyłączone
true -Włączone
Właściwość MSBuild TieredCompilationQuickJitForLoops false -Wyłączone
true -Włączone
Zmienna środowiskowa COMPlus_TC_QuickJitForLoops lub DOTNET_TC_QuickJitForLoops 0 -Wyłączone
1 -Włączone

Przykłady

plik runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation.QuickJitForLoops": false
      }
   }
}

plik runtimeconfig.template.json:

{
   "configProperties": {
      "System.Runtime.TieredCompilation.QuickJitForLoops": false
   }
}

Plik projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
  </PropertyGroup>

</Project>

ReadyToRun

  • Określa, czy środowisko uruchomieniowe platformy .NET Core używa wstępnie skompilowanego kodu dla obrazów z dostępnymi danymi ReadyToRun. Wyłączenie tej opcji wymusza użycie środowiska uruchomieniowego do kodu struktury kompilowania JIT.
  • Aby uzyskać więcej informacji, zobacz Gotowość do uruchomienia.
  • Jeśli to ustawienie zostanie pominięte, platforma .NET używa danych ReadyToRun, gdy są dostępne. Jest to równoważne ustawieniu wartości na 1.
Nazwa ustawienia Wartości
Zmienna środowiskowa COMPlus_ReadyToRun lub DOTNET_ReadyToRun 1 -Włączone
0 -Wyłączone

Optymalizacja sterowana profilem

To ustawienie umożliwia optymalizację dynamiczną (warstwową) z przewodnikiem (PGO) na platformie .NET 6 i nowszych wersjach.

Nazwa ustawienia Wartości
Zmienna środowiskowa DOTNET_TieredPGO 1 -Włączone
0 -Wyłączone
Właściwość MSBuild TieredPGO true -Włączone
false -Wyłączone

Optymalizacja sterowana profilem (PGO) to miejsce, w którym kompilator JIT generuje zoptymalizowany kod pod względem typów i ścieżek kodu, które są najczęściej używane. Dynamiczne rozwiązanie PGO działa ręcznie z kompilacją warstwową w celu dalszej optymalizacji kodu na podstawie dodatkowej instrumentacji wprowadzonej w warstwie 0.

Przykłady

Plik projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredPGO>true</TieredPGO>
  </PropertyGroup>

</Project>