Opzioni di configurazione del runtime per la compilazione

Questo articolo illustra nel dettaglio le impostazioni che è possibile usare per configurare la compilazione .NET.

Nota

.NET 6 standardizza il prefisso DOTNET_ anziché quello di COMPlus_ per le variabili di ambiente che configurano il comportamento in fase di esecuzione di .NET. Tuttavia, il prefisso diCOMPlus_ continuerà a funzionare. Se si usa una versione precedente del runtime .NET, è comunque consigliabile usare il prefisso COMPlus_ per le variabili di ambiente.

Compilazione a livelli

  • Determina se il compilatore JIT usa la compilazione a livelli. La compilazione a livelli esegue la transizione dei metodi tramite due livelli:
    • Il primo livello genera codice più rapidamente (JIT rapido) o carica codice precompilato (ReadyToRun).
    • Il secondo livello genera codice ottimizzato in background ("ottimizzazione di JIT").
  • In .NET Core 3.0 e versioni successive la compilazione a livelli è abilitata per impostazione predefinita.
  • In .NET Core 2.1 e 2.2 la compilazione a livelli è disabilitata per impostazione predefinita.
  • Per altre informazioni, vedere la Guida alla compilazione a livelli.
Nome impostazione Valori
runtimeconfig.json System.Runtime.TieredCompilation true - abilitata
false: disabilitata
Proprietà MSBuild TieredCompilation true: abilitata
false: disabilitata
Variabile di ambiente COMPlus_TieredCompilation oppure DOTNET_TieredCompilation 1 - abilitata
0: disabilitata

Esempi

File runtimeconfig.json:

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

File runtimeconfig.template.json:

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

File di progetto:

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

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

</Project>

JIT rapido

  • Determina se il compilatore JIT usa JIT rapido. Per i metodi che non contengono cicli e per cui il codice precompilato non è disponibile, JIT rapido esegue più rapidamente la compilazione, ma senza ottimizzazioni.
  • L'abilitazione di JIT rapido riduce il tempo di avvio, ma può produrre codice con caratteristiche di prestazioni ridotte. È ad esempio possibile che il codice usi più spazio dello stack, allochi più memoria e venga eseguito più lentamente.
  • Se JIT rapido è disabilitato ma la compilazione a livelli è abilitata, solo il codice precompilato partecipa alla compilazione a livelli. Se un metodo non viene precompilato con ReadyToRun, il comportamento JIT equivale a quello dello scenario con compilazione a livelli disabilitata.
  • In .NET Core 3.0 e versioni successive JIT rapido è abilitato per impostazione predefinita.
  • In .NET Core 2.1 e 2.2 JIT rapido è disabilitato per impostazione predefinita.
Nome impostazione Valori
runtimeconfig.json System.Runtime.TieredCompilation.QuickJit true - abilitata
false: disabilitata
Proprietà MSBuild TieredCompilationQuickJit true: abilitata
false: disabilitata
Variabile di ambiente COMPlus_TC_QuickJit oppure DOTNET_TC_QuickJit 1 - abilitata
0: disabilitata

Esempi

File runtimeconfig.json:

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

File runtimeconfig.template.json:

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

File di progetto:

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

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

</Project>

JIT rapido per i cicli

  • Determina se il compilatore JIT usa JIT rapido nei metodi che contengono cicli.
  • L'abilitazione JIT rapido per i cicli può migliorare le prestazioni di avvio. Tuttavia, i cicli a esecuzione prolungata possono rimanere bloccati nel codice meno ottimizzato per periodi estesi.
  • Se JIT rapido è disabilitato, questa impostazione non ha alcun effetto.
  • Se si omette questa impostazione, JIT rapido non viene usato per i metodi che contengono cicli. Ciò equivale a impostare il valore su false.
Nome impostazione Valori
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false - disabilitata
true: abilitata
Proprietà MSBuild TieredCompilationQuickJitForLoops false: disabilitata
true: abilitata
Variabile di ambiente COMPlus_TC_QuickJitForLoops oppure DOTNET_TC_QuickJitForLoops 0 - disabilitata
1: abilitata

Esempi

File runtimeconfig.json:

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

File runtimeconfig.template.json:

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

File di progetto:

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

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

</Project>

ReadyToRun

  • Determina se il runtime di .NET Core usa codice precompilato per le immagini con dati ReadyToRun disponibili. La disabilitazione di questa opzione forza il runtime a compilare con JIT il codice del framework.
  • Per altre informazioni, vedere ReadyToRun.
  • Se si omette questa impostazione, .NET usa i dati ReadyToRun quando sono disponibili. Ciò equivale a impostare il valore su 1.
Nome impostazione Valori
Variabile di ambiente COMPlus_ReadyToRun oppure DOTNET_ReadyToRun 1 - abilitata
0: disabilitata

Ottimizzazione GPO

Questa impostazione abilita l'ottimizzazione pgo (pgo) dinamica (a livelli) in .NET 6 e versioni successive.

Nome impostazione Valori
Variabile di ambiente DOTNET_TieredPGO 1 - abilitata
0: disabilitata
Proprietà MSBuild TieredPGO true: abilitata
false - disabilitata

L'ottimizzazione PGO (Profile-Guided Optimization) è la posizione in cui il compilatore JIT genera codice ottimizzato in termini di tipi e percorsi di codice usati più di frequente. PgO dinamico funziona a portata di mano con la compilazione a livelli per ottimizzare ulteriormente il codice in base a strumentazione aggiuntiva che viene messa in atto durante il livello 0.

Esempi

File di progetto:

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

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

</Project>