Cinder ffynhonnell agored Facebook, fforc o CPython a ddefnyddir gan Instagram

Mae Facebook wedi cyhoeddi'r cod ffynhonnell ar gyfer Project Cinder, fforc o CPython 3.8.5, prif gyfeiriad gweithredu iaith raglennu Python. Defnyddir cinder yn seilwaith cynhyrchu Facebook i bweru Instagram ac mae'n cynnwys optimeiddiadau i wella perfformiad.

Cyhoeddir y cod i drafod y posibilrwydd o drosglwyddo'r optimeiddiadau parod i'r prif fframwaith CPython ac i helpu prosiectau eraill sy'n ymwneud â gwella perfformiad CPython. Nid yw Facebook yn bwriadu cefnogi Cinder ar ffurf prosiect ffynhonnell agored ar wahân a chyflwynir y cod yn y ffurf y caiff ei ddefnyddio yn seilwaith y cwmni, heb gribo a dogfennaeth ychwanegol. Nid ydynt ychwaith yn ceisio hyrwyddo Cinder fel dewis arall yn lle CPython - prif nod datblygiad yw'r awydd i wella CPython ei hun.

Nodir bod y cod Cinder yn weddol ddibynadwy ac yn cael ei brofi mewn amgylcheddau cynhyrchu, ond os canfyddir problemau, bydd yn rhaid i chi eu datrys eich hun, gan nad yw Facebook yn gwarantu y bydd yn ymateb i negeseuon gwall allanol a cheisiadau tynnu. Ar yr un pryd, nid yw Facebook yn eithrio cydweithrediad adeiladol gyda'r gymuned ac mae'n barod i drafod syniadau ar sut i wneud Cinder hyd yn oed yn gyflymach neu sut i gyflymu'r broses o drosglwyddo newidiadau parod i brif ran CPython.

Prif optimeiddiadau ar waith yn Cinder:

  • Cadw bytecode yn fewnol (“bytecode”). Hanfod y dull yw nodi sefyllfaoedd lle mae opcode nodweddiadol yn cael ei weithredu y gellir ei optimeiddio, a disodli opcode o'r fath yn ddeinamig gydag opsiynau arbenigol cyflymach (er enghraifft, disodli swyddogaethau a elwir yn aml).
  • Gwerthusiad coroutine awyddus. Ar gyfer galwadau swyddogaeth async sy'n cael eu prosesu ar unwaith (nid yw aros yn arwain at aros ac mae'r swyddogaeth yn cyrraedd y datganiad dychwelyd yn gynharach), amnewidir canlyniad swyddogaethau o'r fath yn uniongyrchol heb greu coroutine na chynnwys dolen digwyddiad. Mewn cod Facebook sy'n defnyddio async / aros yn helaeth, mae'r optimeiddio yn arwain at gyflymu tua 5%.
  • Casgliad JIT dethol ar lefel dulliau a swyddogaethau unigol (dull-ar-y-amser). Wedi'i alluogi trwy'r opsiwn “-X jit” neu'r newidyn amgylchedd PYTHONJIT=1 ac yn caniatáu ichi gyflymu gweithrediad llawer o brofion perfformiad 1.5-4 gwaith. Gan mai dim ond ar gyfer swyddogaethau a gyflawnir yn aml y mae llunio JIT yn berthnasol, nid yw'n ddoeth ei ddefnyddio ar gyfer swyddogaethau a ddefnyddir yn anaml, a gall y gorbenion casglu ond arafu gweithrediad y rhaglen.

    Trwy'r opsiwn "-X jit-list-file=/path/to/jitlist.txt" neu'r newidyn amgylchedd "PYTHONJITLISTFILE=/path/to/jitlist.txt" gallwch nodi ffeil gyda rhestr o swyddogaethau y mae JIT ar eu cyfer gellir ei ddefnyddio (fformat llwybr .to.module:funcname neu path.to.module:ClassName.method_name). Gellir pennu'r rhestr o swyddogaethau y dylid galluogi JIT ar eu cyfer yn seiliedig ar y canlyniadau proffilio. Yn y dyfodol, disgwylir cefnogaeth ar gyfer llunio JIT deinamig yn seiliedig ar ddadansoddiad mewnol o amlder galwadau swyddogaeth, ond gan ystyried manylion y prosesau lansio ar Instagram, mae crynhoad JIT hefyd yn addas ar gyfer Facebook yn y cam cychwynnol.

    Yn gyntaf mae JIT yn trosi bytecode Python yn gynrychiolaeth ganolraddol lefel uchel (HIR), sy'n weddol agos at bytecode Python, ond mae wedi'i gynllunio i ddefnyddio peiriant rhithwir sy'n seiliedig ar gofrestr yn lle un sy'n seiliedig ar stac, ac mae hefyd yn defnyddio gwybodaeth math ac ychwanegol manylion perfformiad-feirniadol (fel cyfrif cyfeiriadau). Yna caiff yr HIR ei drosi i ffurflen SSA (aseiniad sengl statig) ac mae'n mynd trwy gamau optimeiddio sy'n ystyried canlyniadau cyfrif cyfeiriadau a data defnydd cof. O ganlyniad, cynhyrchir cynrychiolaeth ganolradd lefel isel (LIR) sy'n agos at iaith y cynulliad. Ar ôl cyfnod arall o optimeiddio LIR, mae cyfarwyddiadau cydosod yn cael eu cynhyrchu gan ddefnyddio'r llyfrgell asmjit.

  • Modd llym ar gyfer modiwlau. Mae'r swyddogaeth yn cynnwys tair cydran: Math StrictModule. Dadansoddwr statig a all benderfynu nad yw gweithrediad modiwl yn cael unrhyw effaith ar god y tu allan i'r modiwl hwnnw. Mae llwythwr modiwl sy'n pennu bod y modiwlau mewn modd caeth (mae'r cod yn nodi “mewnforio __strict__”), yn gwirio am absenoldeb croestoriadau â modiwlau eraill, ac yn llwytho modiwlau llym i sys.modules fel gwrthrych StrictModule.
  • Mae Static Python yn gasglwr cod byte arbrofol sy'n defnyddio anodiadau math i gynhyrchu bytecode math-benodol sy'n rhedeg yn gyflymach diolch i gasgliad JIT. Mewn rhai profion, mae'r cyfuniad o Statig Python a JIT yn dangos gwelliannau perfformiad hyd at 7 gwaith o'i gymharu â CPython safonol. Mewn llawer o sefyllfaoedd, amcangyfrifir bod y canlyniadau yn agos at ddefnyddio casglwyr MyPyC a Cython.

Ffynhonnell: opennet.ru

Ychwanegu sylw