本文詳細說明了你可以用來設定 .NET 編譯的設定。
階層式編譯
- 設定即時編譯器是否使用分層編譯。 分層編譯方法可分為兩層:
- 第一層程式碼產生速度較快(快速 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 編譯器是否使用 QUICK 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 編譯器是否對包含迴圈的方法使用 quick 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>