Facebook iepen boarne Cinder, in gabel fan CPython brûkt troch Instagram

Facebook hat de boarnekoade publisearre foar Project Cinder, in gabel fan CPython 3.8.5, de wichtichste referinsje-ymplemintaasje fan 'e Python-programmearringstaal. Cinder wurdt brûkt yn 'e produksje-ynfrastruktuer fan Facebook om Instagram te bemachtigjen en omfettet optimalisaasjes om prestaasjes te ferbetterjen.

De koade wurdt publisearre om de mooglikheid te besprekken om de tariede optimisaasjes te portearjen nei it haad CPython-ramt en om oare projekten te helpen belutsen by it ferbetterjen fan CPython-prestaasjes. Facebook is net fan doel om Cinder te stypjen yn 'e foarm fan in apart iepen boarne-projekt en de koade wurdt presintearre yn' e foarm wêryn't it wurdt brûkt yn 'e ynfrastruktuer fan it bedriuw, sûnder ekstra kammen en dokumintaasje. Se besykje ek net Cinder te befoarderjen as alternatyf foar CPython - it haaddoel fan ûntwikkeling is de winsk om CPython sels te ferbetterjen.

De Cinder-koade wurdt opmurken as frij betrouber en hifke yn produksjeomjouwings, mar as problemen wurde identifisearre, moatte jo se sels oplosse, om't Facebook net garandearret dat it sil reagearje op eksterne flaterberjochten en pull-oanfragen. Tagelyk slút Facebook gjin konstruktive gearwurking mei de mienskip út en is ree om ideeën te besprekken oer hoe't jo Cinder noch rapper meitsje kinne of hoe't jo de oerdracht fan tarete wizigingen nei it haaddiel fan CPython fersnelle kinne.

Main optimalisaasjes ymplementearre yn Cinder:

  • Inline caching fan bytekoade ("shadow bytecode"). De essinsje fan 'e metoade is om situaasjes te identifisearjen wêr't in typyske opkoade wurdt útfierd dy't kin wurde optimalisearre, en sa'n opkoade dynamysk te ferfangen mei flugger spesjalisearre opsjes (bygelyks it ferfangen fan faak neamde funksjes).
  • Eager coroutine evaluaasje. Foar async-funksje-oanroppen dy't fuortendaliks ferwurke wurde (wachtsje resultearret net yn in wachtsjen en de funksje berikt earder de return-statement), wurdt it resultaat fan sokke funksjes direkt ferfongen sûnder in koroutine te meitsjen of in evenemint-loop te belûken. Yn Facebook-koade dy't in protte async / wachtet brûkt, resultearret de optimalisaasje yn in fersnelling fan sawat 5%.
  • Selektive JIT-kompilaasje op it nivo fan yndividuele metoaden en funksjes (metoade-op-ien-tiid). Ynskeakele fia de opsje "-X jit" as de PYTHONJIT = 1 omjouwingsfariabele en kinne jo de útfiering fan in protte prestaasjetests mei 1.5-4 kear fersnelle. Om't JIT-kompilaasje allinich relevant is foar faak útfierde funksjes, is it net oan te rieden om it te brûken foar selden brûkte funksjes, wêrfan de kompilaasje-overhead allinich de útfiering fan programma's kin fertrage.

    Fia de opsje “-X jit-list-file=/path/to/jitlist.txt” of de omjouwingsfariabele “PYTHONJITLISTFILE=/path/to/jitlist.txt” kinne jo in triem oantsjutte mei in list mei funksjes wêrfoar JIT kin brûkt wurde (paadformaat .to.module:funcname of path.to.module:ClassName.method_name). De list mei funksjes wêrfoar JIT moat wurde ynskeakele kin wurde bepaald op basis fan de profilearring resultaten. Yn 'e takomst wurdt stipe foar dynamyske JIT-kompilaasje ferwachte op basis fan ynterne analyse fan' e frekwinsje fan funksje-oanroppen, mar mei rekkening mei de spesifikaasjes fan it lansearjen fan prosessen op Instagram, is JIT-kompilaasje ek geskikt foar Facebook yn 'e earste faze.

    JIT konvertearret Python-bytekoade earst yn in hege-nivo intermediate representation (HIR), dy't frij tichtby Python-bytecode leit, mar is ûntworpen om in register-basearre firtuele masine te brûken ynstee fan in stack-basearre, en brûkt ek typeynformaasje en ekstra prestaasje-krityske details (lykas referinsjetelling). De HIR wurdt dan omboud ta SSA (statyske single assignment) foarm en giet troch optimisaasjestappen dy't rekken hâlde mei referinsje-telresultaten en gegevens foar ûnthâldferbrûk. As gefolch, in leech-nivo tuskenlizzende fertsjintwurdiging (LIR) wurdt generearre, tichtby assembly taal. Nei in oare faze fan LIR-basearre optimalisaasjes, gearstalling ynstruksjes wurde generearre mei help fan de asmjit bibleteek.

  • Strikte modus foar modules. De funksjonaliteit omfettet trije komponinten: Type StrictModule. In statyske analysator dy't kin bepale dat de útfiering fan in module gjin ynfloed hat op koade bûten dy module. In module loader dat bepaalt dat de modules binne yn strang modus (de koade spesifisearret "ymport __strict__"), kontrolearret foar it ûntbrekken fan krusingen mei oare modules, en laden strang modules yn sys.modules as in StrictModule foarwerp.
  • Static Python is in eksperimintele bytecode-kompiler dy't type-annotaasjes brûkt om type-spesifike bytekoade te generearjen dy't rapper rint troch JIT-kompilaasje. Yn guon tests toant de kombinaasje fan Static Python en JIT prestaasjesferbetteringen fan oant 7 kear yn fergeliking mei standert CPython. Yn in protte situaasjes wurde de resultaten rûsd tichtby it brûken fan de MyPyC- en Cython-kompilers.

Boarne: opennet.ru

Keapje betroubere hosting foar siden mei DDoS-beskerming, VPS VDS-tsjinners 🔥 Keapje betroubere websidehosting mei DDoS-beskerming, VPS VDS-tsjinners | ProHoster