共用方式為


編譯的執行時配置選項

本文詳細說明了你可以用來設定 .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>