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