Cloudflare, Mozilla in Facebook razvijajo BinaryAST za pospešitev nalaganja JavaScripta

Inženirji iz Cloudflare, Mozilla, Facebook in Bloomberg predlagal nov format BinarniAST za pospešitev dostave in obdelave kode JavaScript pri odpiranju spletnih mest v brskalniku. BinaryAST premakne fazo razčlenjevanja na strežniško stran in zagotovi že ustvarjeno drevo abstraktne sintakse (AST). Ko prejme BinaryAST, lahko brskalnik nemudoma nadaljuje s stopnjo prevajanja, pri čemer obide razčlenjevanje izvorne kode JavaScript.

Za testiranje pripravljeno referenčna izvedba, dobavljena pod licenco MIT. Komponente Node.js se uporabljajo za razčlenjevanje, koda za optimizacijo in generiranje AST pa je napisana v Rustu. Podpora na strani brskalnika
BinaryAST je že na voljo v nočne gradnje Firefox. Kodirnik v BinaryAST se lahko uporablja na ravni orodij končnega mesta in za pakiranje skriptov zunanjih mest na strani proxyja ali omrežja za dostavo vsebine. Trenutno se je proces standardizacije BinaryAST s strani delovne skupine že začel ECMA TC39, po katerem bo format lahko sobival z obstoječimi metodami stiskanja vsebine, kot sta gzip in brotli.

Cloudflare, Mozilla in Facebook razvijajo BinaryAST za pospešitev nalaganja JavaScripta

Cloudflare, Mozilla in Facebook razvijajo BinaryAST za pospešitev nalaganja JavaScripta

Pri obdelavi JavaScripta se precej časa porabi za fazo nalaganja in razčlenjevanja kode. Glede na to, da je obseg prenesenega JavaScripta na številnih priljubljenih mestih blizu 10 MB (na primer za LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), začetna obdelava JavaScripta povzroči precejšnjo zamudo. Stopnja razčlenjevanja na strani brskalnika je upočasnjena tudi zaradi nezmožnosti popolne gradnje AST sproti, ko se koda nalaga (brskalnik mora počakati, da se bloki kode naložijo, kot je konec funkcij, da pridobi informacije, ki manjkajo za razčlenitev trenutnih elementov).

Težavo poskušajo delno rešiti z distribucijo kode v pomanjšani in stisnjeni obliki ter s predpomnjenjem generirane bajtne kode s strani brskalnika. Na sodobnih spletnih mestih se koda posodablja precej pogosto, zato predpomnjenje le delno reši težavo. WebAssembly bi lahko bil rešitev, vendar zahteva eksplicitno vnašanje kode in ni najbolj primeren za pospešitev obdelave obstoječe kode JavaScript.

Druga možnost je dostaviti že pripravljeno prevedeno bajtno kodo namesto skriptov JavaScript, vendar razvijalci brskalnikov temu nasprotujejo, ker je bajtno kodo tretjih oseb težko preveriti, njena neposredna obdelava pa lahko povzroči razslojevanje spleta, pojavijo se dodatna varnostna tveganja in razvoj potrebna je univerzalna oblika bajtne kode.

BinaryAST vam omogoča, da se prilagodite svojemu trenutnemu modelu razvoja in dostave kode, ne da bi ustvarili novo bajtno kodo ali spremenili jezik JavaScript. Velikost podatkov v formatu BinaryAST je primerljiva s stisnjeno pomanjšano JavaScript kodo, hitrost obdelave pa se z odpravo faze razčlenjevanja izvornega besedila opazno poveča. Poleg tega format omogoča prevajanje v bajtno kodo, ko se naloži BinaryAST, ne da bi čakali, da se vsi podatki dokončajo. Poleg tega vam razčlenjevanje na strani strežnika omogoča, da iz vrnjene predstavitve BinaryAST izključite neuporabljene funkcije in nepotrebno kodo, ki pri razčlenjevanju na strani brskalnika izgublja čas tako pri razčlenjevanju kot pri prenašanju nepotrebnega prometa.

Značilnost BinaryAST je tudi zmožnost obnovitve berljivega JavaScripta, ki ni popolnoma enak izvirni različici, je pa pomensko enakovreden in vključuje enaka imena spremenljivk in funkcij (BinaryAST shrani imena, ne shrani pa informacij o pozicijah v koda, oblikovanje in komentarji). Druga plat medalje je pojav novih vektorjev napadov, ki pa so po besedah ​​razvijalcev veliko manjši in bolj obvladljivi kot pri uporabi alternativ, kot je distribucija bajtne kode.

Preizkusi kode facebook.com so pokazali, da razčlenjevanje JavaScripta porabi 10–15 % virov procesorja in da razčlenjevanje traja več časa kot generiranje bajtne kode in začetno generiranje kode za JIT. V motorju SpiderMonkey traja čas za popolno izdelavo AST 500–800 ms, uporaba BinaryAST pa je to številko zmanjšala za 70–90 %.
Na splošno se pri večini spletnih ognjemetov pri uporabi BinaryAST čas razčlenjevanja JavaScript skrajša za 3-10 % v načinu brez optimizacije in za 90-97 %, ko je omogočen način ignoriranja neuporabljenih funkcij.
Pri izvajanju 1.2 MB testnega nabora JavaScript je uporaba BinaryAST omogočila pospešitev zagonskega časa s 338 na 314 ms na namiznem sistemu (Intel i7) in z 2019 na 1455 ms na mobilni napravi (HTC One M8).

Vir: opennet.ru

Dodaj komentar