適用於編譯的執行階段組態選項

此文章詳細說明可用來在 .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_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>