Bagikan melalui


Xamarin.Mac sebelumnya kompilasi

Gambaran Umum

Kompilasi ahead of time (AOT) adalah teknik pengoptimalan yang kuat untuk meningkatkan performa startup. Namun, ini juga memengaruhi waktu build, ukuran aplikasi, dan eksekusi program Anda dengan cara yang mendalam. Untuk memahami tradeoff yang diberlakukannya, kita akan menyelami sedikit ke dalam kompilasi dan eksekusi aplikasi.

Kode yang ditulis dalam bahasa terkelola, seperti C# dan F#, dikompilasi ke representasi perantara yang disebut IL. IL ini, disimpan di pustaka dan rakitan program Anda, relatif ringkas dan portabel antara arsitektur prosesor. IL, bagaimanapun, hanya seperangkat instruksi perantara dan pada titik tertentu BAHWA IL perlu diterjemahkan ke dalam kode mesin khusus untuk prosesor.

Ada dua titik di mana pemrosesan ini dapat dilakukan:

  • Just in time (JIT) – Selama startup dan eksekusi aplikasi Anda, IL dikompilasi dalam memori ke kode mesin.
  • Ahead of time (AOT) – Selama build IL dikompilasi dan ditulis ke pustaka asli dan disimpan dalam bundel aplikasi Anda.

Setiap opsi memiliki sejumlah keuntungan dan tradeoff:

  • JIT
    • Waktu Mulai – Kompilasi JIT harus dilakukan pada startup. Untuk sebagian besar aplikasi, ini ada pada urutan 100ms, tetapi untuk aplikasi besar kali ini bisa lebih signifikan.
    • Eksekusi – Karena kode JIT dapat dioptimalkan untuk prosesor tertentu yang digunakan, kode yang sedikit lebih baik dapat dihasilkan. Di sebagian besar aplikasi, ini adalah beberapa poin persentase paling cepat.
  • AOT
    • Waktu Mulai – Memuat dylibs yang telah dikompilasi sebelumnya secara signifikan lebih cepat daripada rakitan JIT.
    • Ruang Disk - Dilib tersebut dapat mengambil sejumlah besar ruang disk. Tergantung pada rakitan mana yang AOTed, rakitan tersebut dapat menggandakan atau lebih ukuran bagian kode aplikasi Anda.
    • Waktu Build – Kompilasi AOT secara signifikan lebih lambat JIT dan akan memperlambat build menggunakannya. Perlambatan ini dapat berkisar dari detik hingga satu menit atau lebih, tergantung pada ukuran dan jumlah rakitan yang dikompilasi.
    • Obfuscation – Karena IL, yang secara signifikan lebih mudah direkayasa balik daripada kode mesin, tidak selalu diperlukan, itu dapat dilucuti untuk membantu mengaburkan kode sensitif. Ini memerlukan opsi "Hibrid" yang dijelaskan di bawah ini.

Mengaktifkan AOT

Opsi AOT akan ditambahkan ke panel Build Mac dalam pembaruan mendatang. Hingga saat itu, mengaktifkan AOT memerlukan melewati argumen baris perintah melalui bidang "Argumen mmp tambahan" di Build Mac. Opsinya meliputi:

--aot[=VALUE]          Specify assemblies that should be AOT compiled
                          - none - No AOT (default)
                          - all - Every assembly in MonoBundle
                          - core - Xamarin.Mac, System, mscorlib
                          - sdk - Xamarin.Mac.dll and BCL assemblies
                          - |hybrid after option enables hybrid AOT which
                          allows IL stripping but is slower (only valid
                          for 'all')
                          - Individual files can be included for AOT via +
                          FileName.dll and excluded via -FileName.dll

                          Examples:
                            --aot:all,-MyAssembly.dll
                            --aot:core,+MyOtherAssembly.dll,-mscorlib.dll

AOT Hibrid

Selama eksekusi aplikasi macOS, runtime default menggunakan kode mesin yang dimuat dari pustaka asli yang diproduksi oleh kompilasi AOT. Namun, ada beberapa area kode seperti trampolin, di mana kompilasi JIT dapat menghasilkan hasil yang jauh lebih dioptimalkan. Ini mengharuskan IL rakitan terkelola tersedia. Di iOS, aplikasi dibatasi dari penggunaan kompilasi JIT apa pun; bagian kode tersebut juga dikompilasi AOT.

Opsi hibrid menginstruksikan pengkompilasi untuk mengkompilasi bagian ini (seperti iOS) tetapi juga untuk mengasumsikan bahwa IL tidak akan tersedia saat runtime. IL ini kemudian dapat dilucuti pasca build. Seperti disebutkan di atas, runtime akan dipaksa untuk menggunakan rutinitas yang kurang dioptimalkan di beberapa tempat.

Pertimbangan lebih lanjut

Konsekuensi negatif dari skala AOT dengan ukuran dan jumlah rakitan yang diproses. Kerangka kerja Target penuh misalnya berisi Pustaka Kelas Dasar (BCL) yang jauh lebih besar daripada Modern, dan dengan demikian AOT akan memakan waktu jauh lebih lama dan menghasilkan bundel yang lebih besar. Ini diperparah dengan ketidakcocokan kerangka kerja target penuh dengan Penautan, yang menghapus kode yang tidak digunakan. Pertimbangkan untuk memindahkan aplikasi Anda ke Modern dan mengaktifkan Penautan untuk hasil terbaik.

Satu manfaat tambahan dari AOT dilengkapi dengan interaksi yang ditingkatkan dengan penelusuran kesalahan asli dan pembuatan profil toolchain. Karena sebagian besar basis kode akan dikompilasi sebelumnya, basis kode akan memiliki nama fungsi dan simbol yang lebih mudah dibaca di dalam laporan crash asli, pembuatan profil, dan penelusuran kesalahan. Fungsi yang dihasilkan JIT tidak memiliki nama-nama ini dan sering muncul sebagai offset hex yang tidak disebutkan namanya yang sangat sulit untuk diselesaikan.