Поделиться через


Параметры конфигурации времени выполнения для компиляции

В этой статье подробно описаны параметры, которые можно использовать для настройки компиляции .NET.

Примечание.

.NET 6 стандартизует префикс DOTNET_ вместо COMPlus_ для переменных среды, которые настраивают поведение .NET во время выполнения. Но префикс COMPlus_ будет и дальше работать. Если вы используете предыдущую версию среды выполнения .NET, следует и дальше использовать префикс COMPlus_ для переменных среды.

Многоуровневая компиляция

  • Указывает, использует ли JIT-компилятор многоуровневую компиляцию. Методы перехода многоуровневой компиляции через два уровня:
    • Первый уровень создает код быстрее (быстрая JIT-компиляция) или загружает предварительно скомпилированный код (ReadyToRun).
    • Второй уровень создает оптимизированный код в фоновом режиме (JIT-компиляция с оптимизацией).
  • В .NET Core 3.0 и более поздних версий многоуровневая компиляция включена по умолчанию.
  • В .NET Core 2.1 и 2.2 многоуровневая компиляция отключена по умолчанию.
  • Дополнительные сведения см. в руководстве по многоуровневой компиляции.
Имя настройки Values
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-компиляция отключена по умолчанию.
Имя настройки Values
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.
Имя настройки Values
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-компиляцию платформенного кода.
  • Дополнительные сведения см. в статье о ReadyToRun.
  • Если этот параметр не задан, .NET использует данные ReadyToRun, когда они доступны. Это эквивалентно присвоению значения 1.
Имя настройки Values
Переменная среды COMPlus_ReadyToRun или DOTNET_ReadyToRun 1 — включено
0 — отключено

Профильная оптимизация

Этот параметр включает динамическую (многоуровневую) оптимизацию (PGO) в .NET 6 и более поздних версиях.

Имя настройки Values
Переменная среды DOTNET_TieredPGO 1 — включено
0 — отключено
Свойство MSBuild TieredPGO true — включено
false — отключено

Смысл профильной оптимизаций (PGO) заключается в том, что JIT-компилятор создает оптимизированный код с учетом самых часто используемых типов и путей кода. Динамический PGO работает вручную с многоуровневой компиляцией для дальнейшего оптимизации кода на основе дополнительных инструментирования, которые размещаются на уровне 0.

Примеры

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TieredPGO>true</TieredPGO>
  </PropertyGroup>

</Project>