Opções de configuração de tempo de execução para compilação

Este artigo detalha as configurações que você pode usar para configurar a compilação do .NET.

Nota

O .NET 6 padroniza o prefixo DOTNET_ em vez de variáveis de ambiente que configuram o comportamento em tempo de execução do COMPlus_ .NET. No entanto, o prefixo COMPlus_ continuará a funcionar. Se você estiver usando uma versão anterior do tempo de execução do .NET, ainda deverá usar o prefixo COMPlus_ para variáveis de ambiente.

Compilação hierárquica

  • Configura se o compilador just-in-time (JIT) usa compilação em camadas. A compilação hierárquica transiciona métodos através de duas camadas:
    • A primeira camada gera código mais rapidamente (JIT rápido) ou carrega código pré-compilado (ReadyToRun).
    • A segunda camada gera código otimizado em segundo plano ("otimizando JIT").
  • No .NET Core 3.0 e posterior, a compilação em camadas é habilitada por padrão.
  • No .NET Core 2.1 e 2.2, a compilação em camadas é desabilitada por padrão.
  • Para obter mais informações, consulte o Guia de compilação hierárquica.
Nome da definição Valores
runtimeconfig.json System.Runtime.TieredCompilation true - ativado
false - deficientes
Propriedade MSBuild TieredCompilation true - ativado
false - deficientes
Variável de ambiente COMPlus_TieredCompilation ou DOTNET_TieredCompilation 1 - ativado
0 - deficientes

Exemplos

runtimeconfig.json ficheiro:

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

runtimeconfig.template.json arquivo:

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

Ficheiro do projeto:

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

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

</Project>

JIT rápido

  • Configura se o compilador JIT usa JIT rápido. Para métodos que não contêm loops e para os quais o código pré-compilado não está disponível, o JIT rápido os compila mais rapidamente, mas sem otimizações.
  • Habilitar o JIT rápido diminui o tempo de inicialização, mas pode produzir código com características de desempenho degradadas. Por exemplo, o código pode usar mais espaço de pilha, alocar mais memória e executar mais lentamente.
  • Se o JIT rápido estiver desativado, mas a compilação em camadas estiver habilitada, somente o código pré-compilado participará da compilação em camadas. Se um método não for pré-compilado com ReadyToRun, o comportamento JIT será o mesmo como se a compilação em camadas estivesse desativada.
  • No .NET Core 3.0 e posterior, o JIT rápido é habilitado por padrão.
  • No .NET Core 2.1 e 2.2, o JIT rápido é desabilitado por padrão.
Nome da definição Valores
runtimeconfig.json System.Runtime.TieredCompilation.QuickJit true - ativado
false - deficientes
Propriedade MSBuild TieredCompilationQuickJit true - ativado
false - deficientes
Variável de ambiente COMPlus_TC_QuickJit ou DOTNET_TC_QuickJit 1 - ativado
0 - deficientes

Exemplos

runtimeconfig.json ficheiro:

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

runtimeconfig.template.json arquivo:

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

Ficheiro do projeto:

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

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

</Project>

JIT rápido para loops

  • Configura se o compilador JIT usa JIT rápido em métodos que contêm loops.
  • Habilitar o JIT rápido para loops pode melhorar o desempenho da inicialização. No entanto, loops de longa execução podem ficar presos em código menos otimizado por longos períodos.
  • Se o JIT rápido estiver desativado, essa configuração não terá efeito.
  • Se você omitir essa configuração, o JIT rápido não será usado para métodos que contenham loops. Isso equivale a definir o valor como false.
Nome da definição Valores
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false - deficientes
true - ativado
Propriedade MSBuild TieredCompilationQuickJitForLoops false - deficientes
true - ativado
Variável de ambiente COMPlus_TC_QuickJitForLoops ou DOTNET_TC_QuickJitForLoops 0 - deficientes
1 - ativado

Exemplos

runtimeconfig.json ficheiro:

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

runtimeconfig.template.json arquivo:

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

Ficheiro do projeto:

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

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

</Project>

ReadyToRun

  • Configura se o tempo de execução do .NET Core usa código pré-compilado para imagens com dados ReadyToRun disponíveis. A desativação dessa opção força o tempo de execução para o código de estrutura de compilação JIT.
  • Para obter mais informações, consulte Pronto para executar.
  • Se você omitir essa configuração, o .NET usará dados ReadyToRun quando estiverem disponíveis. Isso equivale a definir o valor como 1.
Nome da definição Valores
Variável de ambiente COMPlus_ReadyToRun ou DOTNET_ReadyToRun 1 - ativado
0 - deficientes

Otimização guiada por perfil

Essa configuração permite a otimização orientada por perfil (PGO) dinâmica (hierárquica) no .NET 6 e versões posteriores.

Nome da definição Valores
Variável de ambiente DOTNET_TieredPGO 1 - ativado
0 - deficientes
Propriedade MSBuild TieredPGO true - ativado
false - deficientes

A otimização guiada por perfil (PGO) é onde o compilador JIT gera código otimizado em termos dos tipos e caminhos de código usados com mais frequência. O PGO dinâmico trabalha lado a lado com a compilação hierárquica para otimizar ainda mais o código com base na instrumentação adicional implementada durante a camada 0.

Exemplos

Ficheiro do projeto:

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

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

</Project>