„Cloudflare“, „Mozilla“ ir „Facebook“ kuria „BinaryAST“, kad pagreitintų „JavaScript“ įkėlimą

Inžinieriai iš Cloudflare, Mozilla, Facebook ir Bloomberg pasiūlytas naujas formatas „BinaryAST“ pagreitinti JavaScript kodo pristatymą ir apdorojimą atidarant svetaines naršyklėje. BinaryAST perkelia analizavimo fazę į serverio pusę ir pateikia jau sugeneruotą abstrakčią sintaksės medį (AST). Gavusi „BinaryAST“, naršyklė gali iš karto pereiti į kompiliavimo etapą, apeinant „JavaScript“ šaltinio kodo analizę.

Testavimui paruoštas referencinis diegimas, pateiktas pagal MIT licenciją. Node.js komponentai naudojami analizei, o optimizavimo ir AST generavimo kodas parašytas Rust. Naršyklės pusės palaikymas
„BinaryAST“ jau pasiekiama naktiniai pastatymai Firefox. „BinaryAST“ kodavimo priemonė gali būti naudojama tiek galutinio svetainės įrankių lygyje, tiek išorinių svetainių scenarijų pakavimui tarpinio serverio arba turinio pristatymo tinklo pusėje. Šiuo metu darbo grupė jau pradėjo BinaryAST standartizavimo procesą ECMA TC39, po kurio formatas galės egzistuoti kartu su esamais turinio glaudinimo metodais, tokiais kaip gzip ir brotli.

„Cloudflare“, „Mozilla“ ir „Facebook“ kuria „BinaryAST“, kad pagreitintų „JavaScript“ įkėlimą

„Cloudflare“, „Mozilla“ ir „Facebook“ kuria „BinaryAST“, kad pagreitintų „JavaScript“ įkėlimą

Apdorojant JavaScript, daug laiko praleidžiama įkeliant ir analizuojant kodą. Atsižvelgiant į tai, kad daugelyje populiarių svetainių atsisiųsto „JavaScript“ apimtis yra artima 10 MB (pavyzdžiui, „LinkedIn“ – 7.2 MB, „Facebook“ – 7.1 MB, „Gmail“ – 3.9 MB), pradinis „JavaScript“ apdorojimas sukelia reikšmingą vėlavimą. Naršyklės pusės analizės etapas taip pat sulėtėja dėl to, kad nepavyksta visiškai sukurti AST skrydžio metu, kai įkeliamas kodas (naršyklė turi palaukti, kol kodo blokai bus įkelti, pvz., funkcijų pabaiga, kad gautų informacijos, kurios trūksta dabartiniams elementams išanalizuoti).

Jie bando iš dalies išspręsti problemą paskirstydami kodą sumažintu ir suglaudintu pavidalu, taip pat naršyklės talpykloje sugeneruotą baitinį kodą. Šiuolaikinėse svetainėse kodas atnaujinamas gana dažnai, todėl talpyklos talpinimas problemą išsprendžia tik iš dalies. „WebAssembly“ galėtų būti sprendimas, tačiau jai reikia aiškiai įvesti kodą ir jis nėra tinkamas esamo „JavaScript“ kodo apdorojimui paspartinti.

Kita galimybė yra pateikti paruoštą kompiliuotą baitinį kodą, o ne JavaScript scenarijus, tačiau naršyklės variklių kūrėjai tam prieštarauja, nes sunku patikrinti trečiosios šalies baitinį kodą, jo tiesioginis apdorojimas gali sukelti žiniatinklio stratifikaciją, kyla papildomų saugumo pavojų ir reikalingas universalus baitinio kodo formatas.

„BinaryAST“ leidžia prisitaikyti prie dabartinio kodo kūrimo ir pristatymo modelio nekuriant naujo baito kodo ir nekeičiant „JavaScript“ kalbos. Duomenų dydis BinaryAST formatu yra panašus į suglaudintą sumažintą JavaScript kodą, o apdorojimo greitis pašalinus šaltinio teksto analizavimo fazę pastebimai padidėja. Be to, formatas leidžia kompiliuoti baitinį kodą, kai įkeliamas BinaryAST, nelaukiant, kol visi duomenys bus baigti. Be to, analizavimas serverio pusėje leidžia iš grąžinto BinaryAST atvaizdo neįtraukti nepanaudotų funkcijų ir nereikalingo kodo, o tai, analizuojant naršyklės pusėje, gaištamas laikas tiek analizuojant, tiek perduodant nereikalingą srautą.

„BinaryAST“ funkcija taip pat yra galimybė atkurti skaitomą „JavaScript“, kuris nėra visiškai toks pat kaip pradinė versija, bet yra semantiškai lygiavertis ir apima tuos pačius kintamųjų ir funkcijų pavadinimus (BinaryAST išsaugo pavadinimus, bet neišsaugo informacijos apie pozicijas kodas, formatavimas ir komentarai). Kita medalio pusė – naujų atakos vektorių atsiradimas, tačiau, pasak kūrėjų, jie yra daug mažesni ir labiau valdomi nei naudojant alternatyvas, tokias kaip baitinio kodo paskirstymas.

facebook.com kodo testai parodė, kad „JavaScript“ analizavimas sunaudoja 10–15% procesoriaus resursų, o analizavimas užima daugiau laiko nei generuojant baitinį kodą ir pradinį kodo generavimą JIT. „SpiderMonkey“ variklyje laikas visiškai sukurti AST užtrunka 500–800 ms, o naudojant „BinaryAST“ šis skaičius sumažėjo 70–90%.
Apskritai, daugumai žiniatinklio fejerverkų, naudojant BinaryAST, JavaScript analizavimo laikas sutrumpėja 3-10% režimu be optimizavimo ir 90-97%, kai įjungtas nenaudojamų funkcijų ignoravimo režimas.
Vykdant 1.2 MB „JavaScript“ testų rinkinį, naudojant „BinaryAST“ paleisties laikas pailgėjo nuo 338 iki 314 ms stalinio kompiuterio sistemoje („Intel i7“) ir nuo 2019 m. iki 1455 ms mobiliajame įrenginyje („HTC One M8“).

Šaltinis: opennet.ru

Добавить комментарий