Laufzeitkonfigurationsoptionen für die Kompilierung

In diesem Artikel werden die Einstellungen beschrieben, mit denen Sie die Kompilierung in .NET konfigurieren können.

Hinweis

In .NET 6 ist das Präfix DOTNET_ statt COMPlus_ Standard für Umgebungsvariablen, die das .NET-Runtimeverhalten konfigurieren. Das Präfix COMPlus_ funktioniert jedoch weiterhin. Wenn Sie eine frühere Version der .NET-Runtime verwenden, sollten Sie weiterhin das Präfix COMPlus_ für Umgebungsvariablen verwenden.

Mehrstufig Kompilierung

  • Hiermit wird konfiguriert, ob der Just-in-Time-Compiler (JIT) eine mehrstufige Kompilierung verwendet. Die mehrstufige Kompilierung übergibt Methoden über zwei Ebenen:
    • Die erste Stufe erzeugt schneller Code (Quick JIT) oder lädt vorkompilierten Code (ReadyToRun).
    • Die zweite Stufe erstellt optimierten Code im Hintergrund („Optimieren von JIT“).
  • In .NET Core 3.0 und höher ist die mehrstufige Kompilierung standardmäßig aktiviert.
  • In .NET Core 2.1 und 2.2 ist die mehrstufige Kompilierung standardmäßig deaktiviert.
  • Weitere Informationen finden Sie im Leitfaden zur mehrstufigen Kompilierung.
Einstellungsname Werte
runtimeconfig.json System.Runtime.TieredCompilation true – aktiviert
false – deaktiviert
MSBuild-Eigenschaft TieredCompilation true – aktiviert
false – deaktiviert
Umgebungsvariable COMPlus_TieredCompilation oder DOTNET_TieredCompilation 1 – aktiviert
0 – deaktiviert

Beispiele

runtimeconfig.json-Datei:

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

runtimeconfig.template.json-Datei:

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

Projektdatei:

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

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

</Project>

Quick JIT

  • Hiermit wird konfiguriert, ob der JIT-Compiler Quick JIT verwendet. Bei Methoden, die keine Schleifen enthalten und für die kein vorkompilierter Code verfügbar ist, kompiliert Quick JIT diese schneller, aber ohne Optimierungen.
  • Die Aktivierung von Quick JIT verringert die Startzeit, kann aber Code mit verminderten Leistungsmerkmalen erzeugen. Zum Beispiel verwendet der Code möglicherweise mehr Stapelspeicher, kann mehr Speicher belegen und langsamer ausgeführt werden.
  • Wenn Quick JIT deaktiviert, aber die mehrstufige Kompilierung aktiviert ist, wird nur vorkompilierter Code bei der mehrstufigen Kompilierung verwendet. Wenn eine Methode nicht mit ReadyToRun vorkompiliert ist, ist das JIT-Verhalten dasselbe, als wenn die mehrstufige Kompilierung deaktiviert wäre.
  • In .NET Core 3.0 und höher ist Quick JIT standardmäßig aktiviert.
  • In .NET Core 2.1 und 2.2 ist Quick JIT standardmäßig deaktiviert.
Einstellungsname Werte
runtimeconfig.json System.Runtime.TieredCompilation.QuickJit true – aktiviert
false – deaktiviert
MSBuild-Eigenschaft TieredCompilationQuickJit true – aktiviert
false – deaktiviert
Umgebungsvariable COMPlus_TC_QuickJit oder DOTNET_TC_QuickJit 1 – aktiviert
0 – deaktiviert

Beispiele

runtimeconfig.json-Datei:

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

runtimeconfig.template.json-Datei:

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

Projektdatei:

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

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

</Project>

Quick JIT für Schleifen

  • Hiermit wird konfiguriert, ob der JIT-Compiler Quick JIT bei Methoden verwendet, die Schleifen enthalten.
  • Die Aktivierung von Quick JIT für Schleifen kann die Startleistung verbessern. Lange Schleifen können jedoch für lange Zeiträume in weniger optimiertem Code hängen bleiben.
  • Wenn Quick JIT deaktiviert ist, hat diese Einstellung keine Auswirkung.
  • Wenn Sie diese Einstellung weglassen, wird Quick JIT nicht für Methoden verwendet, die Schleifen enthalten. Dies entspricht der Einstellung des Werts auf false.
Einstellungsname Werte
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false – deaktiviert
true – aktiviert
MSBuild-Eigenschaft TieredCompilationQuickJitForLoops false – deaktiviert
true – aktiviert
Umgebungsvariable COMPlus_TC_QuickJitForLoops oder DOTNET_TC_QuickJitForLoops 0 – deaktiviert
1 – aktiviert

Beispiele

runtimeconfig.json-Datei:

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

runtimeconfig.template.json-Datei:

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

Projektdatei:

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

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

</Project>

ReadyToRun

  • Das ReadyToRun-Image konfiguriert, ob die .NET Core-Runtime vorkompilierten Code für Images mit verfügbaren ReadyToRun-Daten verwendet. Wenn Sie diese Option deaktivieren, erzwingt die Runtime eine JIT-Kompilierung für Frameworkcode.
  • Weitere Informationen finden Sie auf der Seite zu Bereit zur Ausführung.
  • Wenn Sie diese Einstellung weglassen, verwendet .NET ReadyToRun-Daten, sofern verfügbar. Dies entspricht der Einstellung des Werts auf 1.
Einstellungsname Werte
Umgebungsvariable COMPlus_ReadyToRun oder DOTNET_ReadyToRun 1 – aktiviert
0 – deaktiviert

Profilgesteuerte Optimierung

Diese Einstellung ermöglicht die dynamische (gestufte) profilgeführte Optimierung (PGO) in .NET 6 und höher.

Einstellungsname Werte
Umgebungsvariable DOTNET_TieredPGO 1 – aktiviert
0 – deaktiviert
MSBuild-Eigenschaft TieredPGO true – aktiviert
false – deaktiviert

Bei der profilgesteuerten Optimierung (PGO) generiert der JIT-Compiler optimierten Code für die am häufigsten verwendeten Typen und Codepfade. Dynamic PGO arbeitet hand-in-Hand mit gestaffelter Kompilierung, um Code basierend auf zusätzlicher Instrumentierung weiter zu optimieren, die während der Ebene 0 eingerichtet wird.

Beispiele

Projektdatei:

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

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

</Project>