Cloudflare, Mozilla i Facebook razvijaju BinaryAST kako bi ubrzali učitavanje JavaScripta

Inženjeri iz Cloudflarea, Mozille, Facebooka i Bloomberga ponudio novi format BinarniAST za ubrzavanje isporuke i obrade JavaScript koda prilikom otvaranja stranica u pregledniku. BinaryAST premješta fazu parsiranja na stranu poslužitelja i isporučuje već generirano stablo apstraktne sintakse (AST). Nakon što primi BinaryAST, preglednik može odmah nastaviti s fazom kompilacije, zaobilazeći analizu izvornog koda JavaScripta.

Za ispitivanje pripremljeno referentna implementacija isporučena pod MIT licencom. Komponente Node.js koriste se za parsiranje, a kod za optimizaciju i generiranje AST-a napisan je u Rustu. Podrška na strani preglednika
BinaryAST je već dostupan u noćne građe Firefox. Koder u BinaryAST-u može se koristiti i na razini alata za krajnje mjesto i za pakiranje skripti vanjskih mjesta na strani proxyja ili mreže za isporuku sadržaja. Trenutačno je radna skupina već započela proces standardizacije BinaryAST-a ECMA TC39, nakon čega će format moći koegzistirati s postojećim metodama kompresije sadržaja, kao što su gzip i brotli.

Cloudflare, Mozilla i Facebook razvijaju BinaryAST kako bi ubrzali učitavanje JavaScripta

Cloudflare, Mozilla i Facebook razvijaju BinaryAST kako bi ubrzali učitavanje JavaScripta

Prilikom obrade JavaScripta, značajna količina vremena se troši na fazu učitavanja i parsiranja koda. Uzimajući u obzir da je količina preuzetog JavaScripta na mnogim popularnim stranicama blizu 10 MB (primjerice za LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), početna obrada JavaScripta uvodi značajno kašnjenje. Faza parsiranja na strani preglednika također je usporena zbog nemogućnosti potpune izgradnje AST-a u hodu dok se kod učitava (preglednik mora čekati da blokovi koda dovrše učitavanje, kao što je završetak funkcija, da bi dobio informacije koje nedostaju za analizu trenutnih elemenata).

Problem pokušavaju djelomično riješiti distribucijom koda u minimiziranom i komprimiranom obliku, kao i predmemoriranjem generiranog bajtkoda od strane preglednika. Na modernim stranicama kod se dosta često ažurira, tako da predmemoriranje samo djelomično rješava problem. WebAssembly bi mogao biti rješenje, ali zahtijeva eksplicitno upisivanje koda i nije prikladan za ubrzavanje obrade postojećeg JavaScript koda.

Druga je mogućnost isporuka gotovog kompajliranog bajt-koda umjesto JavaScript skripti, ali programeri preglednika protive se tome jer je bajt-kod treće strane teško provjeriti, njegova izravna obrada može dovesti do web stratifikacije, pojavljuju se dodatni sigurnosni rizici i razvoj potreban je univerzalni format bajtkoda.

BinaryAST vam omogućuje da se uklopite u svoj trenutni razvoj koda i model isporuke bez stvaranja novog bajt koda ili mijenjanja jezika JavaScript. Veličina podataka u formatu BinaryAST usporediva je s komprimiranim umanjenim JavaScript kodom, a brzina obrade eliminacijom faze parsiranja izvornog teksta značajno se povećava. Osim toga, format omogućuje kompilaciju u bajt kod dok se BinaryAST učitava, bez čekanja da se svi podaci završe. Osim toga, raščlanjivanje na strani poslužitelja omogućuje vam isključivanje nekorištenih funkcija i nepotrebnog koda iz vraćene BinaryAST reprezentacije, što, prilikom raščlanjivanja na strani preglednika, gubi vrijeme na raščlanjivanje i prijenos nepotrebnog prometa.

Značajka BinaryAST-a također je mogućnost vraćanja čitljivog JavaScripta koji nije potpuno isti kao izvorna verzija, ali je semantički ekvivalentan i uključuje iste nazive varijabli i funkcija (BinaryAST sprema imena, ali ne sprema informacije o pozicijama u kod, oblikovanje i komentari). Druga strana medalje je pojava novih vektora napada, ali prema developerima, oni su mnogo manji i lakše ih je kontrolirati nego kada se koriste alternative, kao što je distribucija bajt koda.

Testovi facebook.com koda pokazali su da raščlanjivanje JavaScripta troši 10-15% CPU resursa i raščlanjivanje oduzima više vremena nego generiranje bajt koda i početno generiranje koda za JIT. U pogonu SpiderMonkey, vrijeme za potpunu izgradnju AST-a traje 500-800 ms, a korištenje BinaryAST-a smanjilo je tu brojku za 70-90%.
Općenito, za većinu web vatrometa, kada se koristi BinaryAST, vrijeme parsiranja JavaScripta smanjuje se za 3-10% u načinu rada bez optimizacije i za 90-97% kada je omogućen način ignoriranja neiskorištenih funkcija.
Prilikom pokretanja skupa testova JavaScripta od 1.2 MB, korištenje BinaryAST-a omogućilo je ubrzanje vremena pokretanja s 338 na 314 ms na stolnom sustavu (Intel i7) i s 2019 na 1455 ms na mobilnom uređaju (HTC One M8).

Izvor: opennet.ru

Dodajte komentar