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>