Opsi konfigurasi runtime untuk kompilasi

Artikel ini merinci pengaturan yang dapat Anda gunakan untuk mengonfigurasi kompilasi .NET.

Catatan

.NET 6 menstandarkan pada prefiks DOTNET_ daripada COMPlus_ untuk variabel lingkungan yang mengonfigurasi perilaku run-time .NET. Namun, prefiks COMPlus_ akan terus berfungsi. Jika Anda menggunakan versi runtime .NET sebelumnya, Anda masih harus menggunakan prefiks COMPlus_ untuk variabel lingkungan.

Kompilasi berjenjang

  • Mengonfigurasi apakah pengkompilasi just-in-time (JIT) menggunakan kompilasi berjenjang. Metode transisi kompilasi berjenjang melalui dua tingkatan:
    • Tingkat pertama menghasilkan kode dengan lebih cepat (JIT cepat) atau memuat kode yang telah dikompilasi sebelumnya (ReadyToRun).
    • Tingkat kedua menghasilkan kode yang dioptimalkan di latar belakang ("mengoptimalkan JIT").
  • Di .NET Core 3.0 dan yang lebih baru, kompilasi berjenjang diaktifkan secara default.
  • Di .NET Core 2.1 dan 2.2, kompilasi berjenjang dinonaktifkan secara default.
  • Untuk informasi selengkapnya, lihat panduan kompilasi berjenjang.
Nama pengaturan Nilai
runtimeconfig.json System.Runtime.TieredCompilation true - diaktifkan
false - dinonaktifkan
Properti MSBuild TieredCompilation true - diaktifkan
false - dinonaktifkan
Variabel lingkungan COMPlus_TieredCompilation atau DOTNET_TieredCompilation 1 - diaktifkan
0 - dinonaktifkan

Contoh

File runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation": false
      }
   }
}

file runtimeconfig.template.json:

{
   "configProperties": {
      "System.Runtime.TieredCompilation": false
   }
}

File proyek:

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

  <PropertyGroup>
    <TieredCompilation>false</TieredCompilation>
  </PropertyGroup>

</Project>

JIT Cepat

  • Mengonfigurasi apakah pengkompilasi JIT menggunakan JIT cepat. Untuk metode yang tidak berisi perulangan dan kode yang telah dikompilasi sebelumnya tidak tersedia, JIT cepat mengkompilasinya lebih cepat tetapi tanpa pengoptimalan.
  • Mengaktifkan JIT cepat mengurangi waktu mulai tetapi dapat menghasilkan kode dengan karakteristik performa yang terdegradasi. Misalnya, kode dapat menggunakan lebih banyak ruang tumpukan, mengalokasikan lebih banyak memori, dan menjalankan lebih lambat.
  • Jika JIT cepat dinonaktifkan tetapi kompilasi berjenjang diaktifkan, hanya kode yang dikompilasi sebelumnya yang berpartisipasi dalam kompilasi berjenjang. Jika metode tidak dikompilasi sebelumnya dengan ReadyToRun, perilaku JIT sama seperti jika kompilasi berjenjang dinonaktifkan.
  • Di .NET Core 3.0 dan yang lebih baru, JIT cepat diaktifkan secara default.
  • Di .NET Core 2.1 dan 2.2, JIT cepat dinonaktifkan secara default.
Nama pengaturan Nilai
runtimeconfig.json System.Runtime.TieredCompilation.QuickJit true - diaktifkan
false - dinonaktifkan
Properti MSBuild TieredCompilationQuickJit true - diaktifkan
false - dinonaktifkan
Variabel lingkungan COMPlus_TC_QuickJit atau DOTNET_TC_QuickJit 1 - diaktifkan
0 - dinonaktifkan

Contoh

File runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation.QuickJit": false
      }
   }
}

file runtimeconfig.template.json:

{
   "configProperties": {
      "System.Runtime.TieredCompilation.QuickJit": false
   }
}

File proyek:

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

  <PropertyGroup>
    <TieredCompilationQuickJit>false</TieredCompilationQuickJit>
  </PropertyGroup>

</Project>

JIT cepat untuk perulangan

  • Mengonfigurasi apakah pengkompilasi JIT menggunakan JIT cepat pada metode yang berisi perulangan.
  • Mengaktifkan JIT cepat untuk perulangan dapat meningkatkan performa startup. Namun, perulangan jangka panjang bisa terjebak dalam kode yang kurang dioptimalkan untuk jangka panjang.
  • Jika JIT cepat dinonaktifkan, pengaturan ini tidak berpengaruh.
  • Jika Anda menghilangkan pengaturan ini, JIT cepat tidak digunakan untuk metode yang berisi perulangan. Ini sama dengan mengatur nilai ke false.
Nama pengaturan Nilai
runtimeconfig.json System.Runtime.TieredCompilation.QuickJitForLoops false - dinonaktifkan
true - diaktifkan
Properti MSBuild TieredCompilationQuickJitForLoops false - dinonaktifkan
true - diaktifkan
Variabel lingkungan COMPlus_TC_QuickJitForLoops atau DOTNET_TC_QuickJitForLoops 0 - dinonaktifkan
1 - diaktifkan

Contoh

File runtimeconfig.json:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Runtime.TieredCompilation.QuickJitForLoops": false
      }
   }
}

file runtimeconfig.template.json:

{
   "configProperties": {
      "System.Runtime.TieredCompilation.QuickJitForLoops": false
   }
}

File proyek:

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

  <PropertyGroup>
    <TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
  </PropertyGroup>

</Project>

ReadyToRun

  • Mengonfigurasi apakah runtime .NET Core menggunakan kode yang telah dikompilasi sebelumnya untuk gambar dengan data ReadyToRun yang tersedia. Menonaktifkan opsi ini memaksa runtime ke kode kerangka kerja kompilasi JIT.
  • Untuk informasi selengkapnya, lihat Siap Dijalankan.
  • Jika Anda menghilangkan pengaturan ini, .NET menggunakan data ReadyToRun saat tersedia. Ini sama dengan mengatur nilai ke 1.
Nama pengaturan Nilai
Variabel lingkungan COMPlus_ReadyToRun atau DOTNET_ReadyToRun 1 - diaktifkan
0 - dinonaktifkan

Pengoptimalan yang dipandu profil

Pengaturan ini memungkinkan pengoptimalan yang dipandu profil (PGO) dinamis (berjenjang) di .NET 6 dan versi yang lebih baru.

Nama pengaturan Nilai
Variabel lingkungan DOTNET_TieredPGO 1 - diaktifkan
0 - dinonaktifkan
Properti MSBuild TieredPGO true - diaktifkan
false - dinonaktifkan

Pengoptimalan yang dipandu profil (PGO) adalah tempat pengompilasi JIT menghasilkan kode yang dioptimalkan dalam hal jenis dan jalur kode yang paling sering digunakan. PGO dinamis bekerja bersama dengan kompilasi berjenjang untuk lebih mengoptimalkan kode berdasarkan instrumentasi tambahan yang diberlakukan selama tingkat 0.

Contoh

File proyek:

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

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

</Project>