Facebook Open Source Cinder, eng Gabel vu CPython benotzt vun Instagram

Facebook huet de Quellcode fir Project Cinder publizéiert, eng Gabel vum CPython 3.8.5, d'Haaptreferenzimplementatioun vun der Python Programmiersprache. Cinder gëtt an der Facebook Produktiounsinfrastruktur benotzt fir Instagram z'ënnerstëtzen an enthält Optimisatiounen fir d'Performance ze verbesseren.

De Code gëtt publizéiert fir d'Méiglechkeet ze diskutéieren fir déi virbereet Optimisatiounen an den Haapt CPython Kader ze portéieren an aner Projeten ze hëllefen, déi an der Verbesserung vun der CPython Leeschtung involvéiert sinn. Facebook wëll net Cinder a Form vun engem separaten Open Source Projet z'ënnerstëtzen an de Code gëtt an der Form presentéiert an där et an der Infrastruktur vun der Firma benotzt gëtt, ouni zousätzlech Kamm an Dokumentatioun. Si probéieren och net Cinder als Alternativ zum CPython ze promoten - d'Haaptziel vun der Entwécklung ass de Wonsch CPython selwer ze verbesseren.

De Cinder Code gëtt als zimmlech zouverlässeg bemierkt an a Produktiounsëmfeld getest, awer wann d'Problemer identifizéiert ginn, musst Dir se selwer léisen, well Facebook net garantéiert datt et op externe Fehlermeldungen an Pull-Ufroen reagéiert. Zur selwechter Zäit schléisst Facebook keng konstruktiv Zesummenaarbecht mat der Gemeinschaft aus an ass prett Iddien ze diskutéieren wéi Cinder nach méi séier ze maachen oder wéi een den Transfert vun preparéierten Ännerungen am Haaptdeel vum CPython beschleunegt.

Main Optimisatiounen implementéiert am Cinder:

  • Inline Caching vum Bytecode ("Shadow Bytecode"). D'Essenz vun der Method ass Situatiounen z'identifizéieren wou en typeschen Opcode ausgefouert gëtt deen optimiséiert ka ginn, an esou en Opcode dynamesch mat méi séier spezialiséiert Optiounen ze ersetzen (zum Beispill d'Ersatz vun dacks genannte Funktiounen).
  • Eager Coroutine Evaluatioun. Fir Async Funktioun Uruff déi direkt veraarbecht ginn (waart resultéiert net an enger Waarde an d'Funktioun erreecht d'Retour Ausso fréier), gëtt d'Resultat vun esou Funktiounen direkt ersat ouni eng Coroutine ze kreéieren oder eng Event Loop involvéiert. Am Facebook Code dee vill Async / Waart benotzt, féiert d'Optimiséierung zu enger Geschwindegkeet vu ronn 5%.
  • Selektiv JIT Kompilatioun um Niveau vun eenzelne Methoden a Funktiounen (Methode-zu-e-Zäit). Aktivéiert iwwer d'Optioun "-X jit" oder d'PYTHONJIT = 1 Ëmfeldvariabel an erlaabt Iech d'Ausféierung vu ville Performance Tester ëm 1.5-4 Mol ze beschleunegen. Zënter datt JIT Kompiléierung nëmme fir dacks ausgefouert Funktiounen relevant ass, ass et net passend et fir selten benotzte Funktiounen ze benotzen, d'Kompilatiounsoverhead vun deenen nëmmen d'Ausféierung vum Programm verlangsamen.

    Iwwer d'Optioun "-X jit-list-file=/path/to/jitlist.txt" oder d'Ëmweltvariabel "PYTHONJITLISTFILE=/path/to/jitlist.txt" kënnt Dir e Fichier mat enger Lëscht vu Funktiounen spezifizéieren, fir déi JIT ka benotzt ginn (Wee Format .to.module:funcname oder path.to.module:ClassName.method_name). D'Lëscht vun de Funktiounen, fir déi JIT soll aktivéiert ginn, kann op Basis vun de Profilresultater bestëmmt ginn. An Zukunft gëtt d'Ënnerstëtzung fir dynamesch JIT Kompiléierung erwaart baséiert op der interner Analyse vun der Frequenz vun de Funktiounsruffen, awer wann Dir d'Spezifizitéite vun de Startprozesser op Instagram berücksichtegt, ass JIT Kompilatioun och fir Facebook an der éischter Etapp gëeegent.

    JIT konvertéiert fir d'éischt Python-Bytecode an eng High-Level Intermediate Representation (HIR), déi zimlech no beim Python-Bytecode ass, awer ass entwéckelt fir eng Register-baséiert virtuell Maschinn ze benotzen amplaz vun enger Stack-baséiert, a benotzt och Typinformatioun an zousätzlech Leeschtungskritesch Detailer (wéi Referenzzielen). Den HIR gëtt dann an d'SSA (statesch Single assignment) Form ëmgewandelt a geet duerch Optimisatiounsschrëtt déi Referenzzielresultater an Erënnerungsverbrauchdaten berücksichtegen. Als Resultat gëtt eng Low-Level Intermediate Representation (LIR) generéiert, no bei der Versammlungssprooch. No enger anerer Phase vu LIR-baséiert Optimisatiounen, ginn d'Versammlungsinstruktiounen mat der asmjit Bibliothéik generéiert.

  • Strikt Modus fir Moduler. D'Funktionalitéit enthält dräi Komponenten: Typ StrictModule. E statesche Analysator dee kann bestëmmen datt d'Ausféierung vun engem Modul keen Impakt op de Code ausserhalb vum Modul huet. E Modulloader deen erkennt datt Moduler am strikte Modus sinn (de Code spezifizéiert "Import __strict__"), kontrolléiert fir Amëschen mat anere Moduler a lued strikt Moduler an sys.modules als StrictModule Objet.
  • Static Python ass en experimentellen Bytecode Compiler deen Typ Annotatiounen benotzt fir typespezifesch Bytecode ze generéieren dee méi séier leeft dank der JIT Kompilatioun. An e puer Tester weist d'Kombinatioun vu Static Python a JIT Leeschtungsverbesserunge vu bis zu 7 Mol am Verglach zum Standard CPython. A ville Situatiounen ginn d'Resultater geschat no bei de MyPyC an Cython Compilers ze benotzen.

Source: opennet.ru

Setzt e Commentaire