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


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

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

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

  • Указывает, использует ли компилятор 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 — отключено
Переменная среды 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 — отключено
Переменная среды 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 — включено
Переменная среды 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-компиляцию кода платформы.
  • Дополнительные сведения см. в статье о ReadyToRun.
  • Если этот параметр не указан, .NET использует данные ReadyToRun при его доступности. Это эквивалентно присвоению значения 1.
Название настройки Ценности
Переменная среды DOTNET_ReadyToRun 1 — включено
0 — отключено

Оптимизация с использованием профиля

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

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

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

Примеры

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

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

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

</Project>