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

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

注意

.NET 6 为用于配置 .NET 运行时行为的环境变量标准化前缀 DOTNET_ 而不是 COMPlus_。 但是,COMPlus_ 前缀仍将继续正常工作。 如果使用的是早期版本的 .NET 运行时,则环境变量仍应该使用 COMPlus_ 前缀。

分层编译

  • 配置实时 (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 - 禁用
环境变量 COMPlus_TieredCompilationDOTNET_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 - 禁用
环境变量 COMPlus_TC_QuickJitDOTNET_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

  • 配置 JIT 编译器是否对包含循环的方法使用快速 JIT。
  • 启用适用于循环的快速 JIT 可以提高启动性能。 不过,在优化程度较低的代码中,长时间运行的循环可能会停滞较长时间。
  • 如果禁用快速 JIT,则此设置不起作用。
  • 如果省略此设置,则不会对包含循环的方法使用“快速 JIT”。 它等效于将值设置为 false
设置名
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false - 禁用
true - 启用
MSBuild 属性 TieredCompilationQuickJitForLoops false - 禁用
true - 启用
环境变量 COMPlus_TC_QuickJitForLoopsDOTNET_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 Core 运行时是否要为具有可用 ReadyToRun 数据的映像使用预编译代码。 如果禁用此选项,会强制运行时对框架代码进行 JIT 编译。
  • 有关详细信息,请参阅准备好运行
  • 如果省略此设置,则 .NET 将使用 ReadyToRun 数据(如果可用)。 它等效于将值设置为 1
设置名
环境变量 COMPlus_ReadyToRunDOTNET_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>