Cloudflare, Mozilla og Facebook utvikler BinaryAST for å øke hastigheten på JavaScript-lasting

Ingeniører fra Cloudflare, Mozilla, Facebook og Bloomberg tilbys nytt format binærAST for å fremskynde levering og behandling av JavaScript-kode når du åpner nettsteder i en nettleser. BinaryAST flytter parsingsfasen til serversiden og leverer et allerede generert abstrakt syntakstre (AST). Etter å ha mottatt en BinaryAST, kan nettleseren umiddelbart fortsette til kompileringsstadiet, og omgå parsing av JavaScript-kildekoden.

For testing forberedt referanseimplementering levert under MIT-lisensen. Node.js-komponenter brukes for parsing, og koden for optimalisering og AST-generering er skrevet i Rust. Støtte på nettlesersiden
BinaryAST er allerede tilgjengelig i nattlige bygg Firefox. Koderen i BinaryAST kan brukes både på verktøynivået for sluttsiden og for å pakke skript fra eksterne nettsteder på siden av et proxy- eller innholdsleveringsnettverk. For øyeblikket har prosessen med standardisering av BinaryAST av arbeidsgruppen allerede begynt ECMA TC39, hvoretter formatet vil kunne eksistere side om side med eksisterende innholdskomprimeringsmetoder, for eksempel gzip og brotli.

Cloudflare, Mozilla og Facebook utvikler BinaryAST for å øke hastigheten på JavaScript-lasting

Cloudflare, Mozilla og Facebook utvikler BinaryAST for å øke hastigheten på JavaScript-lasting

Når du behandler JavaScript, brukes en betydelig mengde tid på innlastings- og parsingsfasen av koden. Tatt i betraktning at volumet av nedlastet JavaScript på mange populære nettsteder er nær 10 MB (for eksempel for LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), introduserer den første behandlingen av JavaScript en betydelig forsinkelse. Parsing-stadiet på nettlesersiden er også bremset på grunn av manglende evne til å bygge AST fullt ut mens koden lastes (nettleseren må vente på kodeblokker for å fullføre lasting, for eksempel slutten av funksjoner, for å oppnå informasjonen som mangler for å analysere de gjeldende elementene).

De prøver å delvis løse problemet ved å distribuere koden i en minimert og komprimert form, samt ved å bufre den genererte bytekoden av nettleseren. På moderne nettsteder oppdateres koden ganske ofte, så caching løser bare delvis problemet. WebAssembly kan være en løsning, men det krever eksplisitt inntasting av koden og er ikke godt egnet for å fremskynde behandlingen av eksisterende JavaScript-kode.

Et annet alternativ er å levere ferdig kompilert bytekode i stedet for JavaScript-skript, men utviklere av nettlesermotorer er imot det fordi tredjeparts bytekode er vanskelig å verifisere, dens direkte behandling kan føre til nettstratifisering, ytterligere sikkerhetsrisikoer oppstår og utvikling av et universelt bytekodeformat kreves.

BinaryAST lar deg passe inn i din nåværende kodeutviklings- og leveringsmodell uten å lage ny bytekode eller endre JavaScript-språket. Størrelsen på data i BinaryAST-formatet kan sammenlignes med komprimert minifisert JavaScript-kode, og behandlingshastigheten ved å eliminere kildetekstanalysefasen øker merkbart. I tillegg tillater formatet kompilering til bytekode mens BinaryAST lastes, uten å vente på at alle data skal fullføres. I tillegg lar parsing på serversiden deg ekskludere ubrukte funksjoner og unødvendig kode fra den returnerte BinaryAST-representasjonen, som ved parsing på nettlesersiden kaster bort tid både på å analysere og overføre unødvendig trafikk.

En funksjon ved BinaryAST er også muligheten til å gjenopprette lesbart JavaScript som ikke er helt det samme som den opprinnelige versjonen, men er semantisk ekvivalent og inkluderer de samme navnene på variabler og funksjoner (BinaryAST lagrer navn, men lagrer ikke informasjon om posisjoner i kode, formatering og kommentarer). Den andre siden av mynten er fremveksten av nye angrepsvektorer, men ifølge utviklerne er de mye mindre og mer kontrollerbare enn ved bruk av alternativer, som bytekodedistribusjon.

Tester av facebook.com-koden viste at parsing av JavaScript bruker 10-15 % av CPU-ressursene og parsing tar mer tid enn å generere bytekode og innledende kodegenerering for JIT. I SpiderMonkey-motoren tar tiden for å bygge en AST fullstendig 500-800 ms, og bruken av BinaryAST har redusert dette tallet med 70-90%.
Generelt, for de fleste nettfyrverkeri, når du bruker BinaryAST, reduseres JavaScript-parsetiden med 3-10 % i modusen uten optimalisering og med 90-97 % når modusen for å ignorere ubrukte funksjoner er aktivert.
Når du kjørte et 1.2 MB JavaScript-testsett, tillot bruk av BinaryAST oppstartstiden å øke hastigheten fra 338 til 314 ms på et stasjonært system (Intel i7) og fra 2019 til 1455 ms på en mobilenhet (HTC One M8).

Kilde: opennet.ru

Legg til en kommentar