Параметры конфигурации времени выполнения для компиляции
В этой статье подробно описаны параметры, которые можно использовать для настройки компиляции .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>