Opciones de configuración de ejecución para compilación

En este artículo se detallan los valores que se pueden usar para configurar la compilación de .NET.

Nota:

.NET 6 estandariza en el prefijo DOTNET_ en lugar de en COMPlus_ para las variables de entorno que configuran el comportamiento en tiempo de ejecución de .NET. Sin embargo, el prefijo COMPlus_ seguirá funcionando. Si usa una versión anterior del runtime de .NET, debe seguir usando el prefijo COMPlus_ para las variables de entorno.

Compilación en niveles

  • Configura si el compilador Just-In-Time (JIT) usa la compilación en niveles. La compilación en niveles realiza la transición de métodos mediante dos niveles:
    • El primer nivel genera código más rápidamente (JIT rápido) o carga código previamente compilado (ReadyToRun).
    • El segundo nivel genera código optimizado en segundo plano ("JIT de optimización").
  • En la versión 3.0 de .NET Core y posteriores, la compilación en niveles está habilitada de forma predeterminada.
  • En las versiones 2.1 y 2.2 de .NET Core, la compilación en niveles está deshabilitada de forma predeterminada.
  • Para obtener más información, vea la Guía de compilación en niveles.
Nombre de valor Valores
runtimeconfig.json System.Runtime.TieredCompilation true: habilitado.
false: deshabilitado.
Propiedad de MSBuild TieredCompilation true: habilitado.
false: deshabilitado.
Variable del entorno COMPlus_TieredCompilation o DOTNET_TieredCompilation 1: habilitado.
0: deshabilitado.

Ejemplos

Archivo runtimeconfig.json:

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

archivo runtimeconfig.template.json:

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

Archivo del proyecto:

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

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

</Project>

JIT rápido

  • Configura si el compilador JIT usa JIT rápido. En el caso de los métodos que no contienen bucles y para los que no hay código compilado previamente, JIT rápido los compila más rápidamente, pero sin optimizaciones.
  • La habilitación de JIT rápido reduce el tiempo de inicio, pero puede generar código con características de rendimiento degradadas. Por ejemplo, el código puede usar más espacio de pila, asignar más memoria y ejecutarse más lentamente.
  • Si JIT rápido está deshabilitado pero la compilación en niveles está habilitada, solo el código compilado previamente participa en la compilación en niveles. Si un método no está compilado previamente con ReadyToRun, el comportamiento de JIT es el mismo que si la compilación en niveles estuviera deshabilitada.
  • En .NET Core 3.0 y versiones posteriores, JIT rápido está habilitado de forma predeterminada.
  • En .NET Core 2.1 y 2.2, JIT rápido está deshabilitado de forma predeterminada.
Nombre de valor Valores
runtimeconfig.json System.Runtime.TieredCompilation.QuickJit true: habilitado.
false: deshabilitado.
Propiedad de MSBuild TieredCompilationQuickJit true: habilitado.
false: deshabilitado.
Variable del entorno COMPlus_TC_QuickJit o DOTNET_TC_QuickJit 1: habilitado.
0: deshabilitado.

Ejemplos

Archivo runtimeconfig.json:

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

archivo runtimeconfig.template.json:

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

Archivo del proyecto:

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

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

</Project>

JIT rápido para bucles

  • Configura si el compilador JIT usa JIT rápido en métodos que contienen bucles.
  • La habilitación de JIT rápido para bucles puede mejorar el rendimiento de inicio. Pero los bucles de ejecución prolongada se pueden bloquear en código menos optimizado durante períodos largos.
  • Si JIT rápido está deshabilitado, este valor no tiene ningún efecto.
  • Si se omite esta configuración, el método JIT rápido no se utiliza para los métodos que contienen bucles. Esto es equivalente a establecer el valor en false.
Nombre de valor Valores
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false: deshabilitado.
true: habilitado.
Propiedad de MSBuild TieredCompilationQuickJitForLoops false: deshabilitado.
true: habilitado.
Variable del entorno COMPlus_TC_QuickJitForLoops o DOTNET_TC_QuickJitForLoops 0: deshabilitado.
1: habilitado.

Ejemplos

Archivo runtimeconfig.json:

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

archivo runtimeconfig.template.json:

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

Archivo del proyecto:

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

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

</Project>

ReadyToRun

  • Configura si el entorno de ejecución de .NET Core usa código precompilado para las imágenes con datos de ReadyToRun disponibles. Al deshabilitar esta opción, se fuerza al entorno de ejecución a compilar código de marco mediante JIT.
  • Para obtener más información, consulte Ready to Run.
  • Si se omite esta configuración, .NET usa datos ReadyToRun cuando están disponibles. Esto es equivalente a establecer el valor en 1.
Nombre de valor Valores
Variable del entorno COMPlus_ReadyToRun o DOTNET_ReadyToRun 1: habilitado.
0: deshabilitado.

Optimización guiada por perfiles

Esta configuración habilita la optimización guiada por perfiles (PGO) dinámica (en capas) en .NET 6 y versiones posteriores.

Nombre de valor Valores
Variable del entorno DOTNET_TieredPGO 1: habilitado.
0: deshabilitado.
Propiedad de MSBuild TieredPGO true: habilitado.
false: deshabilitado.

La Optimización guiada por perfiles (PGO) es donde el compilador JIT genera código optimizado en términos de los tipos y rutas de acceso de código que se usan con más frecuencia. PGO dinámico funciona a mano con la compilación en capas para optimizar aún más el código en función de la instrumentación adicional que se ha implementado durante el nivel 0.

Ejemplos

Archivo del proyecto:

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

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

</Project>