Share via


コンパイルのランタイム構成オプション

この記事では、.NET コンパイルを構成するために使用できる設定について詳しく説明します。

注意

.NET 6 では、.NET の実行時の動作を構成する環境変数のプレフィックスが、COMPlus_ ではなく DOTNET_ に標準化されています。 ただし、プレフィックス COMPlus_ は引き続き機能します。 以前のバージョンの .NET ランタイムを使用している場合は、環境変数に COMPlus_ プレフィックスをまだ使用する必要があります。

階層型コンパイル

  • Just-In-Time (JIT) コンパイラで階層型コンパイルを使用するかどうかを構成します。 階層型コンパイルでは、2 つの階層を使用して手法を切り替えます。
    • 最初の階層では、コードの生成を高速化 (クイック JIT) するか、プリコンパイル済みコード (ReadyToRun) を読み込みます。
    • 2 番目の階層では、最適化されたコードをバックグラウンドで生成します ("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

  • 使用可能な ReadyToRun データを含むイメージに対して、.NET Core ランタイムでプリコンパイル済みコードを使用するかどうかを構成します。 このオプションを無効にすると、ランタイムでフレームワーク コードが JIT コンパイルされます。
  • 詳細については、ReadyToRun に関する記事をご覧ください。
  • この設定を省略すると、.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>