Facebook mbukak sumber Cinder, garpu saka CPython digunakake dening Instagram

Facebook wis nerbitake kode sumber kanggo Project Cinder, garpu CPython 3.8.5, implementasi referensi utama saka basa pamrograman Python. Cinder digunakake ing infrastruktur produksi Facebook kanggo daya Instagram lan kalebu optimizations kanggo nambah kinerja.

Kode kasebut diterbitake kanggo ngrembug kemungkinan porting optimisasi sing disiapake menyang kerangka CPython utama lan kanggo mbantu proyek liyane sing melu ningkatake kinerja CPython. Facebook ora arep ndhukung Cinder ing wangun proyek open source kapisah lan kode diwenehi ing wangun kang digunakake ing infrastruktur perusahaan, tanpa combing tambahan lan dokumentasi. Dheweke uga ora nyoba promosi Cinder minangka alternatif kanggo CPython - tujuan utama pangembangan yaiku kepinginan kanggo nambah CPython dhewe.

Kode Cinder kacathet minangka cukup dipercaya lan diuji ing lingkungan produksi, nanging yen masalah diidentifikasi, sampeyan kudu ngatasi dhewe, amarga Facebook ora njamin yen bakal nanggapi pesen kesalahan eksternal lan njaluk panjaluk. Ing wektu sing padha, Facebook ora ngilangi kerjasama sing konstruktif karo komunitas lan siap ngrembug gagasan babagan carane nggawe Cinder luwih cepet utawa carane nyepetake transfer owah-owahan sing disiapake menyang bagean utama CPython.

Optimisasi utama sing ditindakake ing Cinder:

  • Caching inline saka bytecode ("shadow bytecode"). Inti saka cara iki kanggo ngenali kahanan ing ngendi opcode khas dieksekusi sing bisa dioptimalake, lan kanthi dinamis ngganti opcode kasebut kanthi opsi khusus sing luwih cepet (contone, ngganti fungsi sing kerep diarani).
  • Evaluasi coroutine semangat. Kanggo telpon fungsi async sing diproses langsung (ngenteni ora asil ing Enteni lan fungsi tekan statement bali sadurungé), asil fungsi kuwi langsung diganti tanpa nggawe coroutine utawa nglibatno daur ulang acara. Ing kode Facebook sing akeh banget nggunakake async / ngenteni, optimasi ngasilake kacepetan kira-kira 5%.
  • Kompilasi JIT selektif ing tingkat metode lan fungsi individu (method-at-a-time). Diaktifake liwat pilihan "-X jit" utawa variabel lingkungan PYTHONJIT = 1 lan ngidini sampeyan nyepetake eksekusi tes kinerja kanthi kaping 1.5-4. Wiwit kompilasi JIT mung cocog kanggo fungsi sing kerep dileksanakake, ora dianjurake kanggo nggunakake kanggo fungsi sing jarang digunakake, kompilasi nduwur sirah mung bisa nyuda eksekusi program.

    Liwat opsi "-X jit-list-file=/path/to/jitlist.txt" utawa variabel lingkungan "PYTHONJITLISTFILE=/path/to/jitlist.txt" sampeyan bisa nemtokake file kanthi dhaptar fungsi sing JIT bisa digunakake (format path .to.module:funcname utawa path.to.module:ClassName.method_name). Dhaptar fungsi sing JIT kudu diaktifake bisa ditemtokake adhedhasar asil profil. Ing mangsa ngarep, dhukungan kanggo kompilasi JIT dinamis diarepake adhedhasar analisis internal frekuensi panggilan fungsi, nanging kanthi nganggep spesifik proses peluncuran ing Instagram, kompilasi JIT uga cocok kanggo Facebook ing tahap awal.

    JIT pisanan Ngonversi Python bytecode menyang perwakilan penengah tingkat dhuwur (HIR), kang nyedhaki bytecode Python, nanging dirancang kanggo nggunakake mesin virtual basis register tinimbang basis tumpukan, lan uga nggunakake informasi jinis lan tambahan. rincian kinerja-kritis (kayata pancacahan referensi). HIR banjur diowahi kanggo wangun SSA (statis single assignment) lan dadi liwat langkah Optimization sing njupuk menyang akun asil pancacahan referensi lan data konsumsi memori. Akibaté, perwakilan menengah tingkat rendah (LIR) digawe, cedhak karo basa rakitan. Sawise fase liyane optimasi adhedhasar LIR, instruksi perakitan digawe nggunakake perpustakaan asmjit.

  • Mode ketat kanggo modul. Fungsi kasebut kalebu telung komponen: Tipe StrictModule. Analisa statis sing bisa nemtokake manawa eksekusi modul ora ana pengaruhe ing kode ing njaba modul kasebut. A loader modul sing nemtokake sing modul ing mode ketat (kode nemtokake "impor __strict__"), mriksa anané intersections karo modul liyane, lan mbukak modul ketat menyang sys.modules minangka obyek StrictModule.
  • Python statis minangka kompiler bytecode eksperimen sing nggunakake anotasi jinis kanggo ngasilake bytecode khusus sing mlaku luwih cepet amarga kompilasi JIT. Ing sawetara tes, kombinasi Static Python lan JIT nuduhake dandan kinerja nganti 7 kaping dibandhingake CPython standar. Ing akeh kahanan, asil kira-kira cedhak nggunakake kompiler MyPyC lan Cython.

Source: opennet.ru

Add a comment