本文详细介绍了可用于配置 .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>