Opcje konfiguracji środowiska uruchomieniowego na potrzeby kompilacji
W tym artykule szczegółowo przedstawiono ustawienia, których można użyć do skonfigurowania kompilacji platformy .NET.
Uwaga
Program .NET 6 standardizuje prefiks DOTNET_
zamiast COMPlus_
zmiennych środowiskowych, które konfigurują zachowanie czasu wykonywania platformy .NET. COMPlus_
Jednak prefiks będzie nadal działać. Jeśli używasz poprzedniej wersji środowiska uruchomieniowego platformy .NET, nadal należy użyć prefiksu COMPlus_
dla zmiennych środowiskowych.
Kompilacja warstwowa
- Określa, czy kompilator just in time (JIT) używa kompilacji warstwowej. Metody przejścia kompilacji warstwowej za pośrednictwem dwóch warstw:
- Pierwsza warstwa szybciej generuje kod (szybki dostęp JIT) lub ładuje wstępnie skompilowany kod (ReadyToRun).
- Druga warstwa generuje zoptymalizowany kod w tle ("optymalizacja trybu JIT").
- W programie .NET Core 3.0 lub nowszym kompilacja warstwowa jest domyślnie włączona.
- W programie .NET Core 2.1 i 2.2 kompilacja warstwowa jest domyślnie wyłączona.
- Aby uzyskać więcej informacji, zobacz przewodnik kompilacji warstwowej.
Nazwa ustawienia | Wartości | |
---|---|---|
runtimeconfig.json | System.Runtime.TieredCompilation |
true -Włączonefalse -Wyłączone |
Właściwość MSBuild | TieredCompilation |
true -Włączonefalse -Wyłączone |
Zmienna środowiskowa | COMPlus_TieredCompilation lub DOTNET_TieredCompilation |
1 -Włączone0 -Wyłączone |
Przykłady
plik runtimeconfig.json:
{
"runtimeOptions": {
"configProperties": {
"System.Runtime.TieredCompilation": false
}
}
}
plik runtimeconfig.template.json:
{
"configProperties": {
"System.Runtime.TieredCompilation": false
}
}
Plik projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TieredCompilation>false</TieredCompilation>
</PropertyGroup>
</Project>
Szybki dostęp JIT
- Określa, czy kompilator JIT używa szybkiego trybu JIT. W przypadku metod, które nie zawierają pętli i dla których wstępnie skompilowany kod jest niedostępny, szybkie kompilowanie ich JIT jest szybsze, ale bez optymalizacji.
- Włączenie szybkiego trybu JIT zmniejsza czas uruchamiania, ale może generować kod o obniżonej wydajności. Na przykład kod może używać większej ilości miejsca na stosie, przydzielić więcej pamięci i działać wolniej.
- Jeśli szybki dostęp JIT jest wyłączony, ale kompilacja warstwowa jest włączona, tylko wstępnie skompilowany kod uczestniczy w kompilacji warstwowej. Jeśli metoda nie jest wstępnie skompilowana z funkcją ReadyToRun, zachowanie trybu JIT jest takie samo, jak w przypadku wyłączenia kompilacji warstwowej.
- W programie .NET Core 3.0 lub nowszym szybki dostęp JIT jest domyślnie włączony.
- W programach .NET Core 2.1 i 2.2 szybkie JIT jest domyślnie wyłączone.
Nazwa ustawienia | Wartości | |
---|---|---|
runtimeconfig.json | System.Runtime.TieredCompilation.QuickJit |
true -Włączonefalse -Wyłączone |
Właściwość MSBuild | TieredCompilationQuickJit |
true -Włączonefalse -Wyłączone |
Zmienna środowiskowa | COMPlus_TC_QuickJit lub DOTNET_TC_QuickJit |
1 -Włączone0 -Wyłączone |
Przykłady
plik runtimeconfig.json:
{
"runtimeOptions": {
"configProperties": {
"System.Runtime.TieredCompilation.QuickJit": false
}
}
}
plik runtimeconfig.template.json:
{
"configProperties": {
"System.Runtime.TieredCompilation.QuickJit": false
}
}
Plik projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TieredCompilationQuickJit>false</TieredCompilationQuickJit>
</PropertyGroup>
</Project>
Szybki dostęp JIT dla pętli
- Określa, czy kompilator JIT używa szybkiego trybu JIT w metodach zawierających pętle.
- Włączenie szybkiego trybu JIT dla pętli może zwiększyć wydajność uruchamiania. Jednak długotrwałe pętle mogą utknąć w mniej zoptymalizowanym kodzie przez długi czas.
- Jeśli szybki dostęp JIT jest wyłączony, to ustawienie nie ma żadnego wpływu.
- Jeśli to ustawienie zostanie pominięte, szybki dostęp JIT nie jest używany w przypadku metod zawierających pętle. Jest to równoważne ustawieniu wartości na
false
.
Nazwa ustawienia | Wartości | |
---|---|---|
runtimeconfig.json | System.Runtime.TieredCompilation.QuickJitForLoops |
false -Wyłączonetrue -Włączone |
Właściwość MSBuild | TieredCompilationQuickJitForLoops |
false -Wyłączonetrue -Włączone |
Zmienna środowiskowa | COMPlus_TC_QuickJitForLoops lub DOTNET_TC_QuickJitForLoops |
0 -Wyłączone1 -Włączone |
Przykłady
plik runtimeconfig.json:
{
"runtimeOptions": {
"configProperties": {
"System.Runtime.TieredCompilation.QuickJitForLoops": false
}
}
}
plik runtimeconfig.template.json:
{
"configProperties": {
"System.Runtime.TieredCompilation.QuickJitForLoops": false
}
}
Plik projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
</PropertyGroup>
</Project>
ReadyToRun
- Określa, czy środowisko uruchomieniowe platformy .NET Core używa wstępnie skompilowanego kodu dla obrazów z dostępnymi danymi ReadyToRun. Wyłączenie tej opcji wymusza użycie środowiska uruchomieniowego do kodu struktury kompilowania JIT.
- Aby uzyskać więcej informacji, zobacz Gotowość do uruchomienia.
- Jeśli to ustawienie zostanie pominięte, platforma .NET używa danych ReadyToRun, gdy są dostępne. Jest to równoważne ustawieniu wartości na
1
.
Nazwa ustawienia | Wartości | |
---|---|---|
Zmienna środowiskowa | COMPlus_ReadyToRun lub DOTNET_ReadyToRun |
1 -Włączone0 -Wyłączone |
Optymalizacja sterowana profilem
To ustawienie umożliwia optymalizację dynamiczną (warstwową) z przewodnikiem (PGO) na platformie .NET 6 i nowszych wersjach.
Nazwa ustawienia | Wartości | |
---|---|---|
Zmienna środowiskowa | DOTNET_TieredPGO |
1 -Włączone0 -Wyłączone |
Właściwość MSBuild | TieredPGO |
true -Włączonefalse -Wyłączone |
Optymalizacja sterowana profilem (PGO) to miejsce, w którym kompilator JIT generuje zoptymalizowany kod pod względem typów i ścieżek kodu, które są najczęściej używane. Dynamiczne rozwiązanie PGO działa ręcznie z kompilacją warstwową w celu dalszej optymalizacji kodu na podstawie dodatkowej instrumentacji wprowadzonej w warstwie 0.
Przykłady
Plik projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TieredPGO>true</TieredPGO>
</PropertyGroup>
</Project>