適用於編譯的執行階段組態選項
此文章詳細說明可用來在 .NET 中設定編譯的設定。
注意
.NET 6 會針對設定 .NET Runtime 行為的環境變數,透過前置詞 DOTNET_
(而非 COMPlus_
) 進行標準化。 不過,COMPlus_
前置詞將繼續運作。 如果使用舊版的 .NET 執行階段,則您仍應對環境變數使用 COMPlus_
前置詞。
階層式編譯
- 設定 Just-In-Time (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>