用于编译的运行时配置选项

本文详细介绍了可用于配置 .NET 编译的设置。

分层编译

  • 配置实时 (JIT) 编译器是否使用 分层编译。 分层编译通过两个层转换方法:
    • 第一层更快地生成代码(快速 JIT),或加载预编译的代码(ReadyToRun)。
    • 第二层在后台生成优化的代码(“优化 JIT”)。
  • 在 .NET Core 3.0 及更高版本中,默认启用分层编译。
  • 在 .NET Core 2.1 和 2.2 中,默认情况下禁用分层编译。
  • 有关详细信息,请参阅 分层编译指南
设置名称 价值观
runtimeconfig.json System.Runtime.TieredCompilation true - 启用
false - 禁用
MSBuild 属性 TieredCompilation true - 启用
false - 禁用
环境变量 DOTNET_TieredCompilation 1 - 启用
0 - 禁用

例子

runtimeconfig.json 文件:

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

runtimeconfig.template.json 文件:

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

项目文件:

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

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

</Project>

快速 JIT

  • 配置 JIT 编译器是否使用 快速 JIT。 对于不包含循环的方法以及预编译的代码不可用的方法,快速 JIT 会更快地编译它们,但不进行优化。
  • 启用快速 JIT 会缩短启动时间,但可以生成性能下降的代码。 例如,代码可能使用更多堆栈空间、分配更多内存并运行速度较慢。
  • 如果禁用快速 JIT 但启用了 分层编译 ,则只有预编译代码参与分层编译。 如果未使用 ReadyToRun 预编译方法,则 JIT 行为与禁用 分层编译 相同。
  • 在 .NET Core 3.0 及更高版本中,默认启用快速 JIT。
  • 在 .NET Core 2.1 和 2.2 中,默认情况下禁用快速 JIT。
设置名称 价值观
runtimeconfig.json System.Runtime.TieredCompilation.QuickJit true - 启用
false - 禁用
MSBuild 属性 TieredCompilationQuickJit true - 启用
false - 禁用
环境变量 DOTNET_TC_QuickJit 1 - 启用
0 - 禁用

例子

runtimeconfig.json 文件:

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

runtimeconfig.template.json 文件:

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

项目文件:

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

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

</Project>

快速 JIT for 循环

  • 配置 JIT 编译器是否对包含循环的方法使用快速 JIT。
  • 启用快速 JIT for 循环可以提高启动性能。 但是,长时间运行的循环可能会停滞在不太优化的代码中。
  • 如果禁用 快速 JIT ,则此设置不起作用。
  • 如果省略此设置,则快速 JIT 不用于包含循环的方法。 它等效于将值设置为 false
设置名称 价值观
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false - 禁用
true - 启用
MSBuild 属性 TieredCompilationQuickJitForLoops false - 禁用
true - 启用
环境变量 DOTNET_TC_QuickJitForLoops 0 - 禁用
1 - 启用

例子

runtimeconfig.json 文件:

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

runtimeconfig.template.json 文件:

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

项目文件:

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

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

</Project>

ReadyToRun

  • 配置 .NET 运行时是否对具有可用 ReadyToRun 数据的映像使用预编译的代码。 禁用此选项会强制运行时执行 JIT 编译框架代码。
  • 有关详细信息,请参阅准备好运行
  • 如果省略此设置,则 .NET 在可用时使用 ReadyToRun 数据。 它等效于将值设置为 1
设置名称 价值观
环境变量 DOTNET_ReadyToRun 1 - 启用
0 - 禁用

按配置优化

此设置在 .NET 6 及更高版本中启用动态(分层)配置文件引导优化(PGO)。

设置名称 价值观
环境变量 DOTNET_TieredPGO 1 - 启用
0 - 禁用
MSBuild 属性 TieredPGO true - 启用
false - 禁用

配置文件引导优化(PGO)是在其中 JIT 编译器生成经过优化的代码,这些代码根据最常使用的类型和代码路径进行优化。 动态 PGO 与分层编译携手合作,根据第 0 层期间实施的其他检测进一步优化代码。

例子

项目文件:

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

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

</Project>