Facebook open source Cinder, un fork di CPython utilizatu da Instagram

Facebook hà publicatu u codice fonte per Project Cinder, una furchetta di CPython 3.8.5, l'implementazione di riferimentu principale di a lingua di prugrammazione Python. Cinder hè utilizatu in l'infrastruttura di produzzione di Facebook per alimentà Instagram è include ottimisazioni per migliurà u rendiment.

U codice hè publicatu per discutiri a pussibilità di portà l'ottimisazioni preparate à u quadru principale di CPython è per aiutà à altri prughjetti implicati à migliurà u rendiment CPython. Facebook ùn hà micca intenzione di supportà Cinder in a forma di un prughjettu open source separatu è u codice hè presentatu in a forma in quale hè utilizatu in l'infrastruttura di a cumpagnia, senza pettinatura supplementu è documentazione. Ancu ùn pruvate micca di prumove Cinder cum'è una alternativa à CPython - u scopu principale di u sviluppu hè u desideriu di migliurà CPython stessu.

U codice Cinder hè nutatu cum'è abbastanza affidabile è pruvati in ambienti di pruduzzione, ma s'è i prublemi sò identificati, vi tuccherà à risolviri sè stessu, postu chì Facebook ùn guarantisci chì si risponda à i missaghji di errore esterni è tirà dumande. À u listessu tempu, Facebook ùn esclude micca a cooperazione constructiva cù a cumunità è hè pronta per discutiri idee nantu à cumu fà Cinder ancu più veloce o cumu per accelerà u trasferimentu di cambiamenti preparati à a parte principale di CPython.

Principali ottimisazioni implementate in Cinder:

  • Caching in linea di bytecode ("shadow bytecode"). L'essenza di u metudu hè di identificà situazioni induve un opcode tipicu hè eseguitu chì pò esse ottimisatu, è di rimpiazzà dinamicamente un tali opcode cù opzioni specializate più veloci (per esempiu, rimpiazzà funzioni spessu chjamate).
  • Valutazione di coroutine impaziente. Per i chjami di funzioni asincrone chì sò processati immediatamente (aspittà ùn hè micca risultatu in una attesa è a funzione righjunghji a dichjarazione di ritornu prima), u risultatu di tali funzioni hè direttamente sustituitu senza creà una coroutine o implica un ciclu di avvenimentu. In u codice di Facebook chì usa assai async / wait, l'ottimisazione risultati in una accelerazione di circa 5%.
  • Cumpilazione JIT selettiva à u livellu di metudi individuali è funzioni (metudu à tempu). Abilitatu via l'opzione "-X jit" o a variabile d'ambiente PYTHONJIT = 1 è vi permette di accelerà l'esekzione di parechje teste di rendiment per 1.5-4 volte. Siccomu a compilazione JIT hè pertinente solu per e funzioni eseguite frequentemente, ùn hè micca cunsigliatu di usà per e funzioni raramente usate, a cumpilazione di quale pò solu rallentà l'esekzione di u prugramma.

    Via l'opzione "-X jit-list-file=/path/to/jitlist.txt" o a variabile d'ambiente "PYTHONJITLISTFILE=/path/to/jitlist.txt" pudete specificà un schedariu cù una lista di funzioni per quale JIT pò esse usatu (formatu di caminu .to.module:funcname o path.to.module:ClassName.method_name). A lista di funzioni per quale JIT deve esse attivatu pò esse determinata nantu à i risultati di prufilu. In u futuru, u supportu per a compilazione JIT dinamica hè prevista basatu annantu à l'analisi interna di a freccia di e chjama di funzione, ma tenendu in contu i specifichi di i prucessi di lanciamentu in Instagram, a compilazione JIT hè ancu adattata per Facebook in a fase iniziale.

    JIT converte prima bytecode Python in una rapprisintazioni intermediate d'altu livellu (HIR), chì hè abbastanza vicinu à bytecode Python, ma hè pensatu per utilizà una macchina virtuale basata in registru invece di una basata in stack, è usa ancu informazioni di tipu è supplementu. dettagli critichi per u rendiment (cum'è u conte di riferimentu). L'HIR hè cunvertitu in forma SSA (assignazione unica static) è passa per i passi di ottimisazione chì piglianu in contu i risultati di cunti di riferimentu è i dati di cunsumu di memoria. In u risultatu, hè generata una rapprisintazioni intermediata di bassu livellu (LIR), vicinu à a lingua di assemblea. Dopu un'altra fase di ottimisazioni basate in LIR, l'istruzzioni di l'assemblea sò generate cù a biblioteca asmjit.

  • Modu strettu per i moduli. A funziunalità include trè cumpunenti: Type StrictModule. Un analizatore staticu chì pò stabilisce chì l'esekzione di un modulu ùn hà micca impattu nantu à u codice fora di quellu modulu. Un caricatore di moduli chì determina chì i moduli sò in modu strettu (u codice specifica "import __strict__"), verifica l'assenza di intersezioni cù altri moduli, è carica moduli stretti in sys.modules cum'è un oggettu StrictModule.
  • Static Python hè un compilatore di bytecode sperimentale chì usa annotazioni di tipu per generà bytecode di tipu specificu chì corre più veloce grazie à a compilazione JIT. In certi testi, a cumminazzioni di Static Python è JIT mostra miglioramenti di rendiment finu à 7 volte in paragunà à CPython standard. In parechje situazione, i risultati sò stimati per esse vicinu à utilizà i compilatori MyPyC è Cython.

Source: opennet.ru

Add a comment