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 - abilitatafalse : disabilitata |
Proprietà MSBuild | TieredCompilation |
true : abilitatafalse : disabilitata |
Variabile di ambiente | COMPlus_TieredCompilation oppure DOTNET_TieredCompilation |
1 - abilitata0 : 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 - abilitatafalse : disabilitata |
Proprietà MSBuild | TieredCompilationQuickJit |
true : abilitatafalse : disabilitata |
Variabile di ambiente | COMPlus_TC_QuickJit oppure DOTNET_TC_QuickJit |
1 - abilitata0 : 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 - disabilitatatrue : abilitata |
Proprietà MSBuild | TieredCompilationQuickJitForLoops |
false : disabilitatatrue : abilitata |
Variabile di ambiente | COMPlus_TC_QuickJitForLoops oppure DOTNET_TC_QuickJitForLoops |
0 - disabilitata1 : 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 - abilitata0 : 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 - abilitata0 : disabilitata |
Proprietà MSBuild | TieredPGO |
true : abilitatafalse - 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>