Facebook-a çavkaniya vekirî Cinder, çelekek CPython ku ji hêla Instagram ve tê bikar anîn

Facebook koda çavkaniyê ya Project Cinder weşandiye, forkek CPython 3.8.5, pêkanîna referansa sereke ya zimanê bernamesaziya Python. Cinder di binesaziya hilberîna Facebookê de tê bikar anîn da ku Instagram hêzdar bike û ji bo baştirkirina performansê xweşbîniyan vedihewîne.

Kod tê weşandin da ku li ser îhtîmala veguheztina xweşbîniyên amadekirî li çarçoweya sereke ya CPython û ji bo alîkariya projeyên din ên ku di baştirkirina performansa CPython de têkildar in nîqaş bikin. Facebook naxwaze Cinder di forma projeyek çavkaniyek vekirî ya cihêreng de piştgirî bike û kod di forma ku di binesaziya pargîdaniyê de tê bikar anîn, bêyî berhevkirin û belgeyên zêde têne pêşkêş kirin. Di heman demê de ew hewl nadin ku Cinder wekî alternatîfek ji CPython-ê re pêşve bibin - armanca sereke ya pêşkeftinê xwestina çêtirkirina CPython bixwe ye.

Koda Cinder di hawîrdorên hilberandinê de pir pêbawer û ceribandin tê destnîşan kirin, lê heke pirsgirêk bêne tespît kirin, hûn neçar in ku wan bixwe çareser bikin, ji ber ku Facebook garantî nake ku ew ê bersivê bide peyamên xeletiya derveyî û daxwazên xwe bikişîne. Di heman demê de, Facebook hevkariya çêker bi civakê re dernaxe û amade ye ku li ser ramanan nîqaş bike ka meriv çawa Cinder hîn zûtir bike an jî meriv çawa bilezkirina veguheztina guhertinên amadekirî ji beşa sereke ya CPython re bilezîne.

Optimîzasyonên sereke yên ku di Cinder de hatine bicîh kirin:

  • Veşartina navrû ya bytecode ("bytecode shadow"). Esasê rêbazê ev e ku meriv rewşên ku li wir opkodek tîpîk tête darve kirin ku dikare were xweşbîn kirin, û bi dînamîk veguheztina opcodek wusa bi vebijarkên pispor ên bileztir (wek mînak, guheztina fonksiyonên ku pir caran jê re tê gotin) destnîşan dike.
  • Eager nirxandina coroutine. Ji bo bangên fonksiyona async ên ku tavilê têne pêvajo kirin (li benda li bendê nemîne û fonksiyon berê digihîje danezana vegerê), encamên van fonksiyonan rasterast bêyî afirandina kortîneyek an tevlêbûna xelekek bûyerê rasterast tê veguheztin. Di koda Facebook-ê de ku bi giranî async / benda bikar tîne, xweşbîniyek bi qasî 5% lezek encam dide.
  • Berhevkirina JIT-a bijartî di asta rêbaz û fonksiyonên kesane de (rêbaz-di-dem-demek). Bi vebijarka "-X jit" an jî guhêrbara jîngehê PYTHONJIT=1 ve hatî çalak kirin û dihêle hûn 1.5-4 carî lezkirina pêkanîna gelek ceribandinên performansê bikin. Ji ber ku berhevkirina JIT tenê ji bo fonksiyonên ku pir caran têne darve kirin têkildar e, nayê şîret kirin ku ew ji bo fonksiyonên kêm têne bikar anîn bikar bînin, ku serê berhevokê ya ku tenê dikare pêkanîna bernameyê hêdî bike.

    Bi vebijarka "-X jit-list-file=/path/to/jitlist.txt" an guhêrbara jîngehê "PYTHONJITLISTFILE=/path/to/jitlist.txt" hûn dikarin pelek bi navnîşek fonksiyonên ku JIT ji bo wan diyar bikin. dikare were bikar anîn (forma rê .to.module:funcname an rê.to.module:ClassName.method_name). Navnîşa fonksiyonên ku JIT ji bo wan were çalak kirin dikare li ser bingeha encamên profîlê were destnîşankirin. Di pêşerojê de, piştgirî ji berhevkirina JIT-a dînamîkî re li ser bingeha analîza navxweyî ya frekansa bangên fonksiyonê tê çaverê kirin, lê bi girtina taybetmendiyên destpêkirina pêvajoyên li ser Instagram, berhevkirina JIT di qonaxa destpêkê de ji bo Facebook-ê jî maqûl e.

    JIT pêşî bytekodê Python vediguherîne nûnertiyek navîn-asta bilind (HIR), ku bi qasî bytekoda Python-ê ye, lê ji bo karanîna makîneyek virtual-based qeydkirî li şûna makîneyek-based stack-ê hatî sêwirandin, û her weha agahdariya celeb û zêde bikar tîne. hûrguliyên performansê-krîtîk (wek jimartina referansê) . Dûv re HIR di forma SSA (peywira yekane statîk) de tê veguheztin û di gavên xweşbîniyê re derbas dibe ku encamên hejmartina referansê û daneyên karanîna bîranînê digire nav xwe. Wekî encamek, nûneriyek navîn-asta nizm (LIR) tê çêkirin, ku nêzîkî zimanê civînê ye. Piştî qonaxek din a xweşbîniyên LIR-ê, rêwerzên kombûnê bi karanîna pirtûkxaneya asmjit têne çêkirin.

  • Ji bo modulan moda hişk. Fonksiyon sê beşan pêk tîne: Type StrictModule. Analîzatorek statîk ku dikare destnîşan bike ku pêkanîna modulek bandorek li koda li derveyî wê modulê nake. Barkerek modulê ku destnîşan dike ku modul di moda hişk de ne (kod "îxracat __strict__" diyar dike), tunebûna hevbendan bi modulên din re kontrol dike, û modulên hişk di sys.modules de wekî tiştek StrictModule bar dike.
  • Static Python berhevkarek bytekodê ya ceribandinê ye ku annotasyonên celeb bikar tîne da ku bitekodê-taybetî çêbike ku bi saya berhevkirina JIT-ê zûtir dimeşe. Di hin ceribandinan de, berhevoka Static Python û JIT li gorî CPython standard heya 7 carî çêtirkirina performansê nîşan dide. Di gelek rewşan de, encam têne texmîn kirin ku nêzîkê karanîna berhevkarên MyPyC û Cython in.

Source: opennet.ru

Add a comment