Facebook сарчашмаи кушодаи Cinder, як штангаи CPython, ки аз ҷониби Instagram истифода мешавад

Фейсбук рамзи сарчашмаи Project Cinder, як порчаи CPython 3.8.5, татбиқи асосии истинод ба забони барномасозии Python -ро нашр кард. Cinder дар инфрасохтори истеҳсолии Facebook барои пурқувват кардани Instagram истифода мешавад ва оптимизатсияҳоро барои беҳтар кардани кор дар бар мегирад.

Рамз барои баррасии имкони интиқоли оптимизатсияҳои омодашуда ба чаҳорчӯбаи асосии CPython ва кӯмак ба дигар лоиҳаҳое, ки дар беҳтар кардани кори CPython иштирок мекунанд, нашр шудааст. Facebook ният надорад, ки Cinder-ро дар шакли лоиҳаи алоҳидаи кушодаасос дастгирӣ кунад ва код дар шакле, ки дар инфрасохтори ширкат истифода мешавад, бидуни шона ва ҳуҷҷатҳои иловагӣ пешниҳод карда мешавад. Онҳо инчунин кӯшиш намекунанд, ки Cinder-ро ҳамчун алтернатива ба CPython таблиғ кунанд - ҳадафи асосии рушд ин хоҳиши такмил додани худи CPython мебошад.

Рамзи Cinder хеле боэътимод ва дар муҳити истеҳсолӣ санҷидашуда қайд карда мешавад, аммо агар мушкилот муайян карда шаванд, шумо бояд онҳоро худатон ҳал кунед, зеро Facebook кафолат намедиҳад, ки он ба паёмҳои хатогии беруна ҷавоб медиҳад ва дархостҳоро кашад. Дар баробари ин, Facebook ҳамкории созанда бо ҷомеаро истисно намекунад ва омода аст ғояҳоро дар бораи чӣ гуна зудтар кардани Cinder ё чӣ гуна суръат бахшидан ба интиқоли тағйироти омодашуда ба қисми асосии CPython баррасӣ кунад.

Оптимизатсияҳои асосӣ дар Cinder:

  • Кэшкунии дохилии байткод ("байткоди соя"). Моҳияти усул аз муайян кардани ҳолатҳое иборат аст, ки дар он як коди маъмулӣ иҷро карда мешавад, ки онро оптимизатсия кардан мумкин аст ва ба таври динамикӣ иваз кардани чунин опкод бо имконоти махсусгардонидашуда (масалан, иваз кардани функсияҳои зуд-зуд даъватшаванда).
  • Арзёбии корутинӣ. Барои зангҳои функсияи асинхронӣ, ки фавран коркард мешаванд (интизорӣ боиси интизорӣ намешавад ва функсия ба изҳороти бозгашт барвақттар мерасад), натиҷаи ин гуна функсияҳо бидуни эҷоди корутин ё ҷалби даври ҳодиса мустақиман иваз карда мешаванд. Дар коди Facebook, ки асинх/интизорро сахт истифода мебарад, оптимизатсия боиси суръати тақрибан 5% мегардад.
  • Ҷамъоварии интихобии JIT дар сатҳи усулҳо ва функсияҳои инфиродӣ (метод-дар як вақт). Тавассути опсияи "-X jit" ё тағирёбандаи муҳити PYTHONJIT=1 фаъол карда шудааст ва ба шумо имкон медиҳад, ки иҷрои бисёр санҷишҳои иҷроишро 1.5-4 маротиба тезонед. Азбаски тартиб додани JIT танҳо барои функсияҳои зуд-зуд иҷрошаванда мувофиқ аст, тавсия дода намешавад, ки онро барои функсияҳои кам истифодашаванда истифода баред, ки хароҷоти компиляцияи онҳо танҳо иҷрои барномаро суст карда метавонад.

    Тавассути опсияи “-X jit-list-file=/path/to/jitlist.txt” ё тағирёбандаи муҳити зист “PYTHONJITLISTFILE=/path/to/jitlist.txt” шумо метавонед файлеро бо рӯйхати функсияҳое, ки барои онҳо JIT JIT муайян мекунад, муайян кунед. истифода бурдан мумкин аст (формати роҳ .ба модул: номи функсия ё path.to.module: СинфНоми.метод_ном). Рӯйхати функсияҳоеро, ки барои онҳо JIT бояд фаъол карда шавад, дар асоси натиҷаҳои профилсозӣ муайян кардан мумкин аст. Дар оянда, дастгирии тартиб додани динамикии JIT дар асоси таҳлили дохилии басомади зангҳои функсионалӣ дар назар аст, аммо бо дарназардошти хусусиятҳои оғози равандҳо дар Instagram, тартиб додани JIT дар марҳилаи аввал барои Facebook низ мувофиқ аст.

    JIT аввал байткоди Python-ро ба намояндагии сатҳи баланди миёнаравӣ (HIR) табдил медиҳад, ки ба байткоди Python хеле наздик аст, аммо барои истифодаи мошини маҷозӣ дар асоси реестр ба ҷои мошини маҷозӣ тарҳрезӣ шудааст ва инчунин иттилооти навъи ва иловагиро истифода мебарад. тафсилоти муҳими иҷроиш (ба монанди ҳисобкунии истинодҳо). Сипас HIR ба шакли SSA (таъйиноти статикии ягона) табдил дода мешавад ва аз марҳилаҳои оптимизатсия мегузарад, ки натиҷаҳои ҳисобкунии истинодҳо ва маълумоти истеъмоли хотираро ба назар мегиранд. Дар натиҷа, намояндагии сатҳи пасти миёнаравӣ (LIR) тавлид мешавад, ки ба забони ассемблер наздик аст. Пас аз як марҳилаи дигари оптимизатсия дар асоси LIR, дастурҳои васлкунӣ бо истифода аз китобхонаи asmjit тавлид мешаванд.

  • Ҳолати қатъӣ барои модулҳо. Функсия се ҷузъро дар бар мегирад: Type StrictModule. Анализатори статикӣ, ки метавонад муайян кунад, ки иҷрои модул ба коди берун аз он модул таъсир намекунад. Боркунаки модул, ки муайян мекунад, ки модулҳо дар реҷаи қатъӣ қарор доранд (рамз “импорт __strict__”-ро муайян мекунад), мавҷуд набудани чорроҳаҳоро бо модулҳои дигар месанҷад ва модулҳои қатъиро ба sys.modules ҳамчун объекти StrictModule бор мекунад.
  • Static Python як компилятори байткоди таҷрибавӣ мебошад, ки эзоҳҳои навъиро барои тавлиди байткоди навъи мушаххас истифода мебарад, ки ба шарофати тартиб додани JIT тезтар кор мекунад. Дар баъзе санҷишҳо, омезиши Static Python ва JIT беҳбуди корҳоро дар муқоиса бо CPython стандартӣ то 7 маротиба нишон медиҳад. Дар бисёр ҳолатҳо, натиҷаҳо ба истифодаи компиляторҳои MyPyC ва Cython наздиканд.

Манбаъ: opennet.ru

Илова Эзоҳ