A Cloudflare, a Mozilla és a Facebook a BinaryAST-t fejleszti a JavaScript betöltésének felgyorsítása érdekében

A Cloudflare, a Mozilla, a Facebook és a Bloomberg mérnökei felajánlott új formátum bináris AST a JavaScript-kód kézbesítésének és feldolgozásának felgyorsítása oldalak böngészőben történő megnyitásakor. A BinaryAST áthelyezi az elemzési fázist a szerver oldalára, és egy már generált absztrakt szintaxisfát biztosít (AST). A BinaryAST fogadása után a böngésző azonnal továbbléphet a fordítási szakaszba, megkerülve a JavaScript forráskód elemzését.

Teszteléshez előkészített az MIT licenc alatt biztosított referencia megvalósítás. A Node.js komponenseket az elemzéshez használják, az optimalizálás és az AST generálás kódja pedig Rust nyelven van írva. Böngésző oldali támogatás
A BinaryAST már elérhető itt éjszakai gyűlés Firefox. A BinaryAST kódolója a véghely eszközeinek szintjén és külső webhelyek szkriptjeinek csomagolására is használható a proxy vagy tartalomszolgáltató hálózat oldalán. Jelenleg a BinaryAST szabványosítási folyamata a munkacsoport által már megkezdődött ECMA TC39, ami után a formátum képes lesz együtt létezni a meglévő tartalomtömörítési módszerekkel, mint például a gzip és a brotli.

A Cloudflare, a Mozilla és a Facebook a BinaryAST-t fejleszti a JavaScript betöltésének felgyorsítása érdekében

A Cloudflare, a Mozilla és a Facebook a BinaryAST-t fejleszti a JavaScript betöltésének felgyorsítása érdekében

A JavaScript feldolgozása során jelentős idő telik el a kód betöltési és elemzési fázisában. Tekintettel arra, hogy a letöltött JavaScript mennyisége sok népszerű webhelyen megközelíti a 10 MB-ot (például a LinkedInnél - 7.2 MB, a Facebooknál - 7.1 MB, a Gmailnél - 3.9 MB), a JavaScript kezdeti feldolgozása jelentős késést okoz. A böngésző oldalon az elemzési szakasz is lelassul, mivel nem lehet menet közben teljesen felépíteni az AST-t a kód betöltésekor (a böngészőnek meg kell várnia a kódblokkok betöltésének befejezését, például a funkciók végét, hogy megszerezze az aktuális elemek elemzéséhez hiányzó információk).

A problémát részben a kód minimalizált és tömörített terjesztésével, illetve a generált bájtkód böngésző általi gyorsítótárazásával próbálják megoldani. A modern webhelyeken a kód gyakran frissül, így a gyorsítótárazás csak részben oldja meg a problémát. A WebAssembly megoldás lehet, de kifejezetten be kell gépelni a kódot, és nem alkalmas a meglévő JavaScript kód feldolgozásának felgyorsítására.

Egy másik lehetőség, hogy JavaScript szkriptek helyett kész lefordított bájtkódot szállítanak, de a böngészőmotorok fejlesztői ellenzik ezt, mert a harmadik féltől származó bájtkód nehezen ellenőrizhető, közvetlen feldolgozása a web rétegződéséhez vezethet, további biztonsági kockázatok merülnek fel, univerzális bájtkód formátum szükséges.

A BinaryAST lehetővé teszi, hogy új bájtkód létrehozása vagy a JavaScript nyelv megváltoztatása nélkül illeszkedjen a jelenlegi kódfejlesztési és -továbbítási modelljébe. A BinaryAST formátumú adatok mérete összemérhető a tömörített, kicsinyített JavaScript kóddal, és a feldolgozási sebesség a forrásszöveg elemzési fázisának kiiktatásával észrevehetően megnő. Ezenkívül a formátum lehetővé teszi a fordítást bájtkóddal a BinaryAST betöltésekor anélkül, hogy meg kellene várnia az összes adat befejezését. Ezenkívül a szerveroldali elemzés lehetővé teszi a nem használt függvények és a felesleges kódok kizárását a visszaadott BinaryAST reprezentációból, ami a böngészőoldali elemzés során időt veszít az elemzésre és a felesleges forgalom továbbítására.

A BinaryAST egyik jellemzője az is, hogy visszaállíthatja az olvasható JavaScriptet, amely nem teljesen azonos az eredeti verzióval, de szemantikailag egyenértékű, és ugyanazokat a változó- és függvényneveket tartalmazza (a BinaryAST elmenti a neveket, de nem menti el a kód, formázás és megjegyzések). Az érem másik oldala az új támadási vektorok megjelenése, de a fejlesztők szerint ezek sokkal kisebbek és jobban irányíthatóak, mint alternatívák, például bájtkód-elosztás alkalmazásakor.

A facebook.com kód tesztjei kimutatták, hogy a JavaScript elemzése a CPU erőforrásainak 10-15%-át fogyasztja, az elemzés pedig több időt vesz igénybe, mint a bájtkód generálása és a kezdeti kódgenerálás a JIT számára. A SpiderMonkey motorban az AST teljes felépítéséhez szükséges idő 500-800 ms, és a BinaryAST használata 70-90%-kal csökkentette ezt a számot.
Általánosságban elmondható, hogy a legtöbb webes tűzijáték esetében a BinaryAST használatakor a JavaScript elemzési ideje 3-10%-kal csökken az optimalizálás nélküli módban, és 90-97%-kal, ha a nem használt funkciók figyelmen kívül hagyásának módja engedélyezett.
Egy 1.2 MB-os JavaScript tesztkészlet futtatásakor a BinaryAST használata lehetővé tette az indítási idő felgyorsulását 338 ms-ról 314 ms-ra asztali rendszeren (Intel i7), és 2019-ről 1455 ms-ra mobileszközön (HTC One M8).

Forrás: opennet.ru

Hozzászólás