Facebooki avatud lähtekoodiga Cinder, Instagrami kasutatav CPythoni hark

Facebook on avaldanud Project Cinderi lähtekoodi, mis on Pythoni programmeerimiskeele peamise viiterakenduse CPython 3.8.5 hark. Cinderit kasutatakse Facebooki tootmistaristus Instagrami toiteks ja see sisaldab optimeerimisi jõudluse parandamiseks.

Kood avaldatakse selleks, et arutada ettevalmistatud optimeerimiste portimise võimalust CPythoni põhiraamistikku ja aidata teisi CPythoni jõudluse parandamisega seotud projekte. Facebook ei kavatse Cinderit eraldiseisva avatud lähtekoodiga projekti näol toetada ning kood esitatakse sellisel kujul, nagu seda ettevõtte infrastruktuuris kasutatakse, ilma täiendava kammimise ja dokumentatsioonita. Samuti ei üritata Cinderit reklaamida alternatiivina CPythonile – arenduse põhieesmärk on soov CPythonit ennast täiustada.

Cinderi kood on märgitud üsna usaldusväärseks ja tootmiskeskkondades testitud, kuid probleemide tuvastamisel peate need ise lahendama, kuna Facebook ei garanteeri, et see reageerib välistele veateadetele ja tõmbab päringutele. Samas ei välista Facebook konstruktiivset koostööd kogukonnaga ning on valmis arutama ideid, kuidas Cinderit veelgi kiiremaks muuta või kuidas kiirendada ettevalmistatud muudatuste ülekandmist CPythoni põhiossa.

Peamised Cinderis rakendatud optimeerimised:

  • Baitkoodi tekstisisene vahemällu salvestamine (“varibaitkood”). Meetodi olemus on tuvastada olukorrad, kus käivitatakse tüüpiline opkood, mida saab optimeerida, ja asendada selline opkood dünaamiliselt kiiremate spetsialiseeritud suvanditega (näiteks sageli kutsutavate funktsioonide asendamine).
  • Innukas korutiini hindamine. Asünkroonimisfunktsiooni kutsete puhul, mida töödeldakse kohe (ootamine ei too kaasa ootamist ja funktsioon jõuab tagasilause varem), asendatakse selliste funktsioonide tulemus otse ilma korutiini tekitamata või sündmusetsüklit kaasamata. Facebooki koodis, mis kasutab palju asünkrooni/ootmist, kiirendab optimeerimine umbes 5%.
  • Valikuline JIT koostamine üksikute meetodite ja funktsioonide tasandil (method-at-a-time). Lubatud suvandi “-X jit” või keskkonnamuutuja PYTHONJIT=1 kaudu ja võimaldab kiirendada paljude jõudlustestide täitmist 1.5-4 korda. Kuna JIT-i kompileerimine on asjakohane ainult sageli täidetavate funktsioonide puhul, ei ole soovitatav seda kasutada harva kasutatavate funktsioonide puhul, mille kompileerimiskulud võivad programmi täitmist ainult aeglustada.

    Valiku “-X jit-list-file=/jitlist/jitlist.txt/tee/tee/jitlist.txt” või keskkonnamuutuja “PYTHONJITLISTFILE=/path/to/jitlist.txt” kaudu saate määrata faili koos funktsioonide loendiga, mille jaoks JIT saab kasutada (tee vorming .to.module:funcname või path.to.module:ClassName.method_name). Funktsioonide loendi, mille jaoks JIT peaks olema lubatud, saab määrata profiilide koostamise tulemuste põhjal. Edaspidi on oodata funktsioonikutsete sageduse siseanalüüsi põhjal dünaamilise JIT-i koostamise tuge, kuid arvestades Instagramis käivitamise protsesside spetsiifikat, sobib JIT-i koostamine algfaasis ka Facebookile.

    JIT teisendab esmalt Pythoni baitkoodi kõrgetasemeliseks vahepealseks esituseks (HIR), mis on Pythoni baitkoodile üsna lähedane, kuid on loodud kasutama registripõhist virtuaalmasinat pinupõhise asemel ning kasutab ka tüübiteavet ja lisa jõudluskriitilised üksikasjad (nt viidete loendamine) . Seejärel teisendatakse HIR SSA (staatiline ühe määramise) vormiks ja läbib optimeerimisetappe, mis võtavad arvesse võrdlusloenduse tulemusi ja mälutarbimise andmeid. Selle tulemusena genereeritakse madala tasemega vaheesitus (LIR), mis on lähedane assemblerkeelele. Pärast LIR-põhise optimeerimise järjekordset etappi genereeritakse koostejuhised asmjiti teegi abil.

  • Moodulite range režiim. Funktsionaalsus sisaldab kolme komponenti: Type StrictModule. Staatiline analüsaator, mis suudab kindlaks teha, et mooduli täitmine ei mõjuta koodi väljaspool seda moodulit. Moodulilaadur, mis teeb kindlaks, et moodulid on ranges režiimis (kood määrab “import __strict__”), kontrollib ristumiskohtade puudumist teiste moodulitega ja laadib ranged moodulid faili sys.modules StrictModule objektina.
  • Staatiline Python on eksperimentaalne baitkoodikompilaator, mis kasutab tüübimärkusi, et luua tüübispetsiifiline baitkood, mis töötab tänu JIT-i kompileerimisele kiiremini. Mõnes testis näitab staatilise Pythoni ja JIT-i kombinatsioon jõudluse paranemist kuni 7 korda võrreldes standardse CPythoniga. Paljudes olukordades on tulemused hinnanguliselt lähedased MyPyC ja Cythoni kompilaatorite kasutamisele.

Allikas: opennet.ru

Lisa kommentaar