Bagikan melalui


Kompilasi ReadyToRun

Waktu dan latensi startup aplikasi .NET dapat ditingkatkan dengan mengkompilasi rakitan aplikasi Anda sebagai format ReadyToRun (R2R). R2R adalah bentuk kompilasi ahead-of-time (AOT).

Biner R2R meningkatkan performa startup dengan mengurangi jumlah pekerjaan yang perlu dilakukan kompilator just-in-time (JIT) sesuai beban aplikasi Anda. Biner berisi kode asli yang serupa dibandingkan dengan apa yang akan dihasilkan JIT. Namun, biner R2R lebih besar karena berisi kode bahasa perantara (IL), yang masih diperlukan untuk beberapa skenario, dan versi asli dari kode yang sama. R2R hanya tersedia saat Anda menerbitkan aplikasi yang menargetkan lingkungan runtime tertentu (RID) seperti Linux x64 atau Windows x64.

Untuk mengkompilasi proyek Anda sebagai ReadyToRun, aplikasi harus diterbitkan dengan properti PublishReadyToRun diatur ke true.

Ada dua cara untuk memublikasikan aplikasi Anda sebagai ReadyToRun:

  1. Tentukan bendera PublishReadyToRun langsung ke perintah terbitkan dotnet. Lihat penerbitan dotnet untuk detailnya.

    dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true
    
  2. Tentukan properti dalam proyek.

    • Tambahkan pengaturan ke <PublishReadyToRun> proyek Anda.
    <PropertyGroup>
      <PublishReadyToRun>true</PublishReadyToRun>
    </PropertyGroup>
    
    • Terbitkan aplikasi tanpa parameter khusus.
    dotnet publish -c Release -r win-x64
    

Dampak penggunaan fitur ReadyToRun

Kompilasi sebelumnya memiliki dampak performa yang kompleks pada performa aplikasi, yang dapat sulit diprediksi. Secara umum, ukuran rakitan akan tumbuh menjadi antara dua hingga tiga kali lebih besar. Peningkatan ukuran fisik file ini dapat mengurangi performa pemuatan rakitan dari disk, dan meningkatkan rangkaian proses yang berfungsi. Namun, sebagai gantinya jumlah metode yang dikompilasi pada run time biasanya berkurang secara substansial. Hasilnya adalah bahwa sebagian besar aplikasi yang memiliki kode dalam jumlah besar menerima manfaat performa besar dari mengaktifkan ReadyToRun. Aplikasi yang memiliki kode dalam jumlah kecil kemungkinan tidak akan mengalami peningkatan signifikan dari mengaktifkan ReadyToRun, karena pustaka runtime .NET telah dikompilasi sebelumnya dengan ReadyToRun.

Peningkatan startup yang dibahas di sini tidak hanya berlaku untuk startup aplikasi, tetapi juga untuk penggunaan pertama kode apa pun dalam aplikasi. Misalnya, ReadyToRun dapat digunakan untuk mengurangi latensi respons penggunaan pertama Api Web dalam aplikasi ASP.NET.

Interaksi dengan kompilasi berjenjang

Kode yang dihasilkan sebelumnya tidak terlalu dioptimalkan seperti kode yang dihasilkan oleh JIT. Untuk mengatasi masalah ini, kompilasi berjenjang akan menggantikan metode ReadyToRun yang umum digunakan dengan metode yang dihasilkan JIT.

Bagaimana kumpulan rakitan yang telah dikompilasi sebelumnya dipilih?

SDK akan melakukan prakombinasikan rakitan yang didistribusikan dengan aplikasi. Untuk aplikasi mandiri, kumpulan rakitan ini akan menyertakan kerangka kerja. Biner C++/CLI tidak memenuhi syarat untuk kompilasi ReadyToRun.

Untuk mengecualikan rakitan tertentu dari pemrosesan ReadyToRun, gunakan <PublishReadyToRunExclude> daftar.

<ItemGroup>
  <PublishReadyToRunExclude Include="Contoso.Example.dll" />
</ItemGroup>

Bagaimana kumpulan metode untuk prakompilasi dipilih?

Kompiler akan mencoba untuk melakukan pra-kompilasi sebanyak mungkin metode. Namun, karena berbagai alasan, tidak diharapkan bahwa menggunakan fitur ReadyToRun akan mencegah JIT dieksekusi. Alasan tersebut dapat mencakup, tetapi tidak terbatas pada:

  • Penggunaan jenis generik yang ditentukan dalam rakitan terpisah.
  • Interop dengan kode asli.
  • Penggunaan intrinsik perangkat keras yang tidak dapat dibuktikan pengkompilasi aman digunakan pada komputer target.
  • Pola IL tertentu yang tidak biasa.
  • Pembuatan metode dinamis melalui refleksi atau LINQ.

Pembuatan simbol untuk digunakan dengan profiler

Saat mengkompilasi aplikasi dengan ReadyToRun, profiler mungkin memerlukan simbol untuk memeriksa file ReadyToRun yang dihasilkan. Untuk mengaktifkan pembuatan simbol, tentukan <PublishReadyToRunEmitSymbols> properti .

<PropertyGroup>
  <PublishReadyToRunEmitSymbols>true</PublishReadyToRunEmitSymbols>
</PropertyGroup>

Simbol-simbol ini akan ditempatkan di direktori penerbitan dan untuk Windows akan memiliki ekstensi file .ni.pdb, dan untuk Linux akan memiliki ekstensi file .r2rmap. File-file ini umumnya tidak didistribusikan ulang ke pelanggan akhir, tetapi biasanya akan disimpan di server simbol. Secara umum simbol ini berguna untuk men-debug masalah performa yang terkait dengan startup aplikasi, karena Kompilasi Bertingkat akan menggantikan kode yang dihasilkan ReadyToRun dengan kode yang dihasilkan secara dinamis. Namun, jika mencoba membuat profil aplikasi yang menonaktifkan Kompilasi Berjenjang, simbol akan berguna.

ReadyToRun Komposit

Kompilasi ReadyToRun normal menghasilkan biner yang dapat dilayani dan dimanipulasi secara individual. Mulai dari .NET 6, dukungan untuk kompilasi Composite ReadyToRun telah ditambahkan. Composite ReadyToRun mengkompilasi sekumpulan rakitan yang harus didistribusikan bersama-sama. Ini memiliki keuntungan bahwa kompilator mampu melakukan pengoptimalan yang lebih baik dan mengurangi serangkaian metode yang tidak dapat dikompilasi melalui proses ReadyToRun. Namun, karena tradeoff, kecepatan kompilasi menurun secara signifikan, dan ukuran file keseluruhan aplikasi meningkat secara signifikan. Karena tradeoff ini, penggunaan Composite ReadyToRun hanya direkomendasikan untuk aplikasi yang menonaktifkan Kompilasi Berjenjang atau aplikasi yang berjalan di Linux yang mencari waktu startup terbaik dengan penyebaran mandiri . Untuk mengaktifkan kompilasi ReadyToRun komposit, tentukan <PublishReadyToRunComposite> properti .

<PropertyGroup>
  <PublishReadyToRunComposite>true</PublishReadyToRunComposite>
</PropertyGroup>

Catatan

Di .NET 6, Composite ReadyToRun hanya didukung untuk penyebaran mandiri .

Pembatasan lintas platform/arsitektur

Untuk beberapa platform SDK, kompilator ReadyToRun mampu mengkompilasi silang untuk platform target lainnya.

Target kompilasi yang didukung dijelaskan dalam tabel di bawah ini saat menargetkan .NET 6 dan versi yang lebih baru.

Platform SDK Platform target yang didukung
Windows X64 Windows (X86, X64, Arm64), Linux (X64, Arm32, Arm64), macOS (X64, Arm64)
Windows X86 Windows (X86), Linux (Arm32)
Linux X64 Linux (X64, Arm32, Arm64), macOS (X64, Arm64)
Linux Arm32 Linux Arm32
Linux Arm64 Linux (X64, Arm32, Arm64), macOS (X64, Arm64)
macOS X64 Linux (X64, Arm32, Arm64), macOS (X64, Arm64)
macOS Arm64 Linux (X64, Arm32, Arm64), macOS (X64, Arm64)

Target kompilasi yang didukung dijelaskan dalam tabel di bawah ini saat menargetkan .NET 5 ke bawah.

Platform SDK Platform target yang didukung
Windows X64 Windows X86, Windows X64, Windows Arm64
Windows X86 Windows X86, Windows Arm32
Linux X64 Linux X86, Linux X64, Linux Arm32, Linux Arm64
Linux Arm32 Linux Arm32
Linux Arm64 Linux Arm64
macOS X64 macOS X64