A Cloudflare, a Mozilla, a Facebook és a Bloomberg mérnökei
Teszteléshez
A BinaryAST már elérhető itt
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