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

Inženjeri iz Cloudflarea, Mozille, Facebooka i Bloomberga ponudio novi format binaryAST da ubrzate isporuku i obradu JavaScript koda prilikom otvaranja sajtova u pretraživaču. BinaryAST pomiče fazu raščlanjivanja na stranu servera i isporučuje već generirano stablo apstraktne sintakse (AST). Nakon što primi BinaryAST, pretraživač može odmah preći na fazu kompilacije, zaobilazeći raščlanjivanje JavaScript izvornog koda.

Za testiranje pripremljeno referentna implementacija isporučena pod MIT licencom. Node.js komponente se koriste za raščlanjivanje, a kod za optimizaciju i generisanje AST-a je napisan u Rustu. Podrška na strani pretraživača
BinaryAST je već dostupan u noćno okupljanje Firefox. Koder u BinaryAST-u može se koristiti i na razini alata za krajnje stranice i za pakovanje skripti vanjskih lokacija na strani proxyja ili mreže za isporuku sadržaja. Trenutno je već započeo proces standardizacije BinaryAST-a od strane radne grupe 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 JavaScript-a, značajna količina vremena se troši u fazi učitavanja i raščlanjivanja koda. S obzirom na to da je obim preuzetog JavaScript-a na mnogim popularnim sajtovima blizu 10 MB (na primjer, za LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), početna obrada JavaScripta uvodi značajno kašnjenje. Faza raščlanjivanja na strani pretraživača je također usporena zbog nemogućnosti da se u potpunosti izgradi AST u hodu dok se kod učitava (pregledač mora čekati da se blokovi koda dovrše učitavanje, kao što je kraj funkcija, da bi dobio informacije koje nedostaju za raščlanjivanje trenutnih elemenata).

Problem pokušavaju djelimično riješiti distribucijom koda u minimiziranom i komprimiranom obliku, kao i keširanjem generiranog bajtkoda od strane pretraživača. Na modernim stranicama kod se ažurira prilično često, tako da keširanje samo djelomično rješava problem. WebAssembly bi mogao biti rješenje, ali zahtijeva eksplicitno kucanje koda i nije dobro prikladan za ubrzavanje obrade postojećeg JavaScript koda.

Druga opcija je isporučiti gotov kompajlirani bajt kod umjesto JavaScript skripti, ali programeri pretraživača su protiv toga jer je bajt kod treće strane teško provjeriti, njegova direktna obrada može dovesti do raslojavanja weba, dodatnih sigurnosnih rizika i razvoja potreban je univerzalni format bajtkoda.

BinaryAST vam omogućava da se uklopite u vaš trenutni model razvoja i isporuke koda bez kreiranja novog bajt koda ili promjene JavaScript jezika. Veličina podataka u BinaryAST formatu je uporediva sa kompresovanim minimiziranim JavaScript kodom, a brzina obrade eliminacijom faze raščlanjivanja izvornog teksta primjetno se povećava. Pored toga, format omogućava kompilaciju u bajtkod kada se učitava BinaryAST, bez čekanja da se svi podaci završe. Osim toga, raščlanjivanje na strani servera omogućava vam da isključite neiskorištene funkcije i nepotreban kod iz vraćene BinaryAST reprezentacije, koja, kada se analizira na strani pretraživača, gubi vrijeme i na raščlanjivanje i na prijenos nepotrebnog prometa.

Značajka BinaryAST je također mogućnost vraćanja čitljivog JavaScripta koji nije potpuno isti kao originalna verzija, ali je semantički ekvivalentan i uključuje ista imena varijabli i funkcija (BinaryAST sprema imena, ali ne sprema informacije o pozicijama u kod, formatiranje i komentari). Druga strana medalje je pojava novih vektora napada, ali prema rečima programera, oni su mnogo manji i podložniji kontroli nego kada se koriste alternative, kao što je distribucija bajtkoda.

Testovi facebook.com koda su pokazali da raščlanjivanje JavaScripta troši 10-15% CPU resursa i da raščlanjivanje traje više vremena od generisanja bajt koda i generisanja početnog koda za JIT. U SpiderMonkey engine-u, vrijeme za potpunu izgradnju AST-a traje 500-800 ms, a korištenje BinaryAST-a smanjilo je ovu cifru za 70-90%.
Općenito, za većinu web vatrometa, kada se koristi BinaryAST, vrijeme analize JavaScripta se smanjuje 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 JavaScript skupa za testiranje od 1.2 MB, korištenje BinaryAST je omogućilo da se vrijeme pokretanja ubrza sa 338 na 314 ms na desktop sistemu (Intel i7) i sa 2019 na 1455 ms na mobilnom uređaju (HTC One M8).

izvor: opennet.ru

Dodajte komentar