Cinder bersumber terbuka Facebook, cabang dari CPython yang digunakan oleh Instagram

Facebook telah menerbitkan kode sumber untuk Project Cinder, cabang dari CPython 3.8.5, implementasi referensi utama dari bahasa pemrograman Python. Cinder digunakan dalam infrastruktur produksi Facebook untuk mendukung Instagram dan mencakup pengoptimalan untuk meningkatkan kinerja.

Kode ini diterbitkan untuk membahas kemungkinan mem-porting optimasi yang telah disiapkan ke kerangka kerja utama CPython dan untuk membantu proyek lain yang terlibat dalam meningkatkan kinerja CPython. Facebook tidak bermaksud untuk mendukung Cinder dalam bentuk proyek sumber terbuka terpisah dan kode disajikan dalam bentuk yang digunakan dalam infrastruktur perusahaan, tanpa penyisiran dan dokumentasi tambahan. Mereka juga tidak mencoba mempromosikan Cinder sebagai alternatif CPython - tujuan utama pengembangannya adalah keinginan untuk meningkatkan CPython itu sendiri.

Kode Cinder dianggap cukup andal dan teruji di lingkungan produksi, tetapi jika masalah teridentifikasi, Anda harus menyelesaikannya sendiri, karena Facebook tidak menjamin bahwa ia akan merespons pesan kesalahan eksternal dan permintaan penarikan. Pada saat yang sama, Facebook tidak mengesampingkan kerjasama konstruktif dengan komunitas dan siap mendiskusikan ide tentang bagaimana membuat Cinder lebih cepat atau bagaimana mempercepat transfer perubahan yang telah disiapkan ke bagian utama CPython.

Pengoptimalan utama yang diterapkan di Cinder:

  • Caching bytecode sebaris (“bytecode bayangan”). Inti dari metode ini adalah untuk mengidentifikasi situasi di mana opcode tipikal dijalankan yang dapat dioptimalkan, dan untuk secara dinamis mengganti opcode tersebut dengan opsi khusus yang lebih cepat (misalnya, mengganti fungsi yang sering dipanggil).
  • Evaluasi coroutine yang penuh semangat. Untuk pemanggilan fungsi async yang diproses segera (menunggu tidak mengakibatkan menunggu dan fungsi mencapai pernyataan return sebelumnya), hasil dari fungsi tersebut langsung diganti tanpa membuat coroutine atau melibatkan perulangan peristiwa. Dalam kode Facebook yang banyak menggunakan async/menunggu, optimasi menghasilkan percepatan sekitar 5%.
  • Kompilasi JIT selektif pada tingkat metode dan fungsi individual (metode pada satu waktu). Diaktifkan melalui opsi “-X jit” atau variabel lingkungan PYTHONJIT=1 dan memungkinkan Anda mempercepat pelaksanaan banyak pengujian kinerja sebanyak 1.5-4 kali lipat. Karena kompilasi JIT hanya relevan untuk fungsi yang sering dijalankan, tidak disarankan menggunakannya untuk fungsi yang jarang digunakan, yang overhead kompilasinya hanya dapat memperlambat eksekusi program.

    Melalui opsi “-X jit-list-file=/path/to/jitlist.txt” atau variabel lingkungan “PYTHONJITLISTFILE=/path/to/jitlist.txt” Anda dapat menentukan file dengan daftar fungsi yang JIT-nya dapat digunakan (format jalur .to.module:funcname atau path.to.module:ClassName.method_name). Daftar fungsi yang JIT harus diaktifkan dapat ditentukan berdasarkan hasil pembuatan profil. Di masa depan, dukungan untuk kompilasi JIT dinamis diharapkan berdasarkan analisis internal frekuensi pemanggilan fungsi, namun dengan mempertimbangkan spesifikasi proses peluncuran di Instagram, kompilasi JIT juga cocok untuk Facebook pada tahap awal.

    JIT pertama-tama mengubah bytecode Python menjadi representasi perantara tingkat tinggi (HIR), yang cukup mirip dengan bytecode Python, tetapi dirancang untuk menggunakan mesin virtual berbasis register alih-alih mesin berbasis tumpukan, dan juga menggunakan informasi tipe dan tambahan detail kinerja penting (seperti penghitungan referensi) . HIR kemudian diubah menjadi bentuk SSA (penugasan tunggal statis) dan melewati langkah-langkah optimasi yang memperhitungkan hasil penghitungan referensi dan data konsumsi memori. Hasilnya, representasi perantara tingkat rendah (LIR) dihasilkan, mirip dengan bahasa rakitan. Setelah fase optimasi berbasis LIR lainnya, instruksi perakitan dibuat menggunakan perpustakaan asmjit.

  • Mode ketat untuk modul. Fungsionalitasnya mencakup tiga komponen: Ketik StrictModule. Penganalisis statis yang dapat menentukan bahwa eksekusi suatu modul tidak berdampak pada kode di luar modul tersebut. Pemuat modul yang menentukan bahwa modul berada dalam mode ketat (kode menentukan “import __strict__”), memeriksa tidak adanya perpotongan dengan modul lain, dan memuat modul ketat ke sys.modules sebagai objek StrictModule.
  • Static Python adalah kompiler bytecode eksperimental yang menggunakan anotasi tipe untuk menghasilkan bytecode tipe spesifik yang berjalan lebih cepat berkat kompilasi JIT. Dalam beberapa pengujian, kombinasi Static Python dan JIT menunjukkan peningkatan kinerja hingga 7 kali lipat dibandingkan CPython standar. Dalam banyak situasi, hasilnya diperkirakan mendekati penggunaan kompiler MyPyC dan Cython.

Sumber: opennet.ru

Tambah komentar