Cloudflare, Mozilla ja Facebook arendavad JavaScripti laadimise kiirendamiseks BinaryAST-i

Cloudflare'i, Mozilla, Facebooki ja Bloombergi insenerid pakutakse uus formaat BinaarneAST JavaScripti koodi edastamise ja töötlemise kiirendamiseks saitide avamisel brauseris. BinaryAST viib sõelumisfaasi serveri poolele ja annab juba loodud abstraktse süntaksipuu (AST). Pärast BinaryAST-i saamist saab brauser kohe asuda kompileerimisetappi, jättes mööda JavaScripti lähtekoodi sõelumisest.

Testimiseks ette valmistatud MIT-litsentsi alusel pakutav viiterakendus. Node.js komponente kasutatakse parsimiseks ning optimeerimise ja AST genereerimise kood on kirjutatud Rust keeles. Brauseripoolne tugi
BinaryAST on juba saadaval öine kokkutulek Firefox. BinaryAST-i kodeerijat saab kasutada nii lõppsaidi tööriistade tasemel kui ka väliste saitide skriptide pakkimiseks puhverserveri või sisuedastusvõrgu poolel. Praegu on töörühma poolt BinaryAST standardimise protsess juba alanud ECMA TC39, misjärel saab vorming eksisteerida koos olemasolevate sisu tihendamise meetoditega, nagu gzip ja brotli.

Cloudflare, Mozilla ja Facebook arendavad JavaScripti laadimise kiirendamiseks BinaryAST-i

Cloudflare, Mozilla ja Facebook arendavad JavaScripti laadimise kiirendamiseks BinaryAST-i

JavaScripti töötlemisel kulub koodi laadimise ja sõelumise faasile märkimisväärne osa aega. Arvestades, et allalaaditud JavaScripti maht paljudel populaarsetel saitidel on ligi 10 MB (näiteks LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), toob JavaScripti esialgne töötlemine kaasa märkimisväärse viivituse. Parsimisetapp brauseri poolel on samuti aeglustunud, kuna AST-i ei ole võimalik koodi laadimise ajal käigu pealt täielikult koostada (brauser peab ootama koodiplokkide laadimise lõpuleviimist, näiteks funktsioonide lõppu, et saada praeguste elementide sõelumiseks puuduv teave).

Nad püüavad probleemi osaliselt lahendada, levitades koodi minimeeritud ja tihendatud kujul, samuti salvestades brauseri loodud baitkoodi vahemällu. Kaasaegsetel saitidel värskendatakse koodi üsna sageli, nii et vahemällu salvestamine lahendab probleemi vaid osaliselt. WebAssembly võiks olla lahendus, kuid see nõuab selgesõnalist koodi sisestamist ja ei sobi hästi olemasoleva JavaScripti koodi töötlemise kiirendamiseks.

Teine võimalus on JavaScripti skriptide asemel tarnida valmis kompileeritud baitkood, kuid brauseri mootorite arendajad on selle vastu, sest kolmanda osapoole baitkoodi on raske kontrollida, selle otsene töötlemine võib viia veebi kihistumiseni, tekivad täiendavad turvariskid ja vaja on universaalset baitkoodi vormingut.

BinaryAST võimaldab teil sobituda teie praeguse koodi arendamise ja edastamise mudeliga ilma uut baitkoodi looma või JavaScripti keelt muutmata. BinaryAST-vormingus olevate andmete suurus on võrreldav tihendatud minimeeritud JavaScripti koodiga ja töötlemiskiirus lähteteksti parsimisetapi kõrvaldamise tõttu suureneb märgatavalt. Lisaks võimaldab vorming kompileerimist baitkodeerida, kui BinaryAST laaditakse, ootamata kõigi andmete valmimist. Lisaks võimaldab serveripoolne parsimine välistada tagastatavast BinaryAST esitusest kasutamata funktsioone ja mittevajaliku koodi, mis brauseri poolel parsimisel raiskab aega nii parsimisele kui ka ebavajaliku liikluse edastamisele.

BinaryAST-i eripäraks on ka võimalus taastada loetav JavaScript, mis ei ole täpselt sama mis algne versioon, kuid on semantiliselt samaväärne ja sisaldab muutujate ja funktsioonide samu nimesid (BinaryAST salvestab nimed, kuid ei salvesta teavet positsioonide kohta kood, vorming ja kommentaarid). Mündi teine ​​pool on uute ründevektorite tekkimine, kuid need on arendajate sõnul palju väiksemad ja paremini juhitavad kui alternatiive, näiteks baitkoodijaotust kasutades.

Facebook.com koodi testid näitasid, et JavaScripti sõelumine kulutab 10-15% CPU ressurssidest ja sõelumine võtab rohkem aega kui baitkoodi genereerimine ja esialgne koodi genereerimine JIT jaoks. SpiderMonkey mootoris kulub AST täielikuks ülesehitamiseks 500-800 ms ja BinaryAST-i kasutamine on seda näitajat vähendanud 70-90%.
Üldiselt väheneb enamiku veebiilutulestiku puhul BinaryAST-i kasutamisel JavaScripti sõelumisaeg 3-10% optimeerimiseta režiimis ja 90-97%, kui on lubatud kasutamata funktsioonide ignoreerimise režiim.
1.2 MB JavaScripti testkomplekti käitamisel võimaldas BinaryAST-i kasutamine töölauasüsteemis (Intel i338) käivitusaega kiirendada 314 ms-lt 7 ms-ni ja mobiilseadmes (HTC One M2019) 1455. aastast 8 ms-ni.

Allikas: opennet.ru

Lisa kommentaar