Cloudflare, Mozilla en Facebook ontwikkelen BinaryAST om het laden van JavaScript te versnellen

Ingenieurs van Cloudflare, Mozilla, Facebook en Bloomberg gesuggereerd nieuw formaat Binaire AST om de levering en verwerking van JavaScript-code te versnellen bij het openen van sites in een browser. BinaryAST brengt de parseerfase naar de serverkant en levert een reeds gevormde abstracte syntaxisboom (AST). Na ontvangst van BinaryAST kan de browser onmiddellijk naar de compilatiefase gaan, waarbij het parseren van de JavaScript-broncode wordt omzeild.

Om uit te proberen voorbereid referentie-implementatie geleverd onder de MIT-licentie. Voor het parseren worden Node.js-componenten gebruikt en de code voor het optimaliseren en genereren van AST is geschreven in Rust. Ondersteuning aan browserzijde
BinaryAST is al beschikbaar in nacht montage Firefox. De encoder in BinaryAST kan zowel op toolkitniveau van de uiteindelijke site worden gebruikt als voor het verpakken van scripts van externe sites aan de kant van een proxy- of contentleveringsnetwerk. Op dit moment is het proces van standaardisatie van BinaryAST door de werkgroep al begonnen. ECMATC39, waarna het formaat naast bestaande methoden voor het comprimeren van de gegeven inhoud kan bestaan, zoals gzip en brotli.

Cloudflare, Mozilla en Facebook ontwikkelen BinaryAST om het laden van JavaScript te versnellen

Cloudflare, Mozilla en Facebook ontwikkelen BinaryAST om het laden van JavaScript te versnellen

Een aanzienlijke hoeveelheid tijd bij de JavaScript-verwerking wordt in beslag genomen door de laad- en parseerfase van de code. Aangezien de hoeveelheid JavaScript die op veel populaire sites wordt gedownload de 10 MB nadert (bijvoorbeeld voor LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), brengt de initiële verwerking van JavaScript een aanzienlijke vertraging met zich mee. De parseerfase aan de browserzijde wordt ook vertraagd vanwege de onmogelijkheid om de AST direct volledig op te bouwen terwijl de code wordt geladen (de browser moet wachten tot de codeblokken klaar zijn met laden, bijvoorbeeld het einde van functies, in om de ontbrekende informatie te verkrijgen om de huidige elementen te ontleden).

Gedeeltelijk proberen ze het probleem op te lossen door de code in een geminimaliseerde en gecomprimeerde vorm te distribueren, en door de gegenereerde bytecode door de browser in het cachegeheugen op te slaan. Op moderne sites wordt de code vrij vaak bijgewerkt, dus caching lost het probleem slechts gedeeltelijk op. WebAssembly zou de oplossing kunnen zijn, maar vereist het expliciet intypen van de code en is niet erg geschikt om de verwerking van reeds bestaande JavaScript-code te versnellen.

Een andere optie is het leveren van vooraf gecompileerde bytecode in plaats van JavaScript-scripts, maar ontwikkelaars van browserengines zijn hiertegen omdat bytecode van derden moeilijk te verifiëren is, de directe verwerking ervan kan leiden tot webgelaagdheid, er extra veiligheidsrisico's ontstaan ​​en de ontwikkeling van een universele bytecode-indeling is vereist.

Met BinaryAST kunt u zich aanpassen aan het huidige codeontwikkelings- en leveringsmodel zonder nieuwe bytecode te creëren en zonder de JavaScript-taal te wijzigen. De grootte van de gegevens in het BinaryAST-formaat is vergelijkbaar met de gecomprimeerde verkleinde JavaScript-code, en de verwerkingssnelheid is merkbaar toegenomen vanwege de uitsluiting van de parseerfase van de broncode. Bovendien maakt het formaat compilatie naar bytecode mogelijk terwijl BinaryAST wordt geladen, zonder te wachten tot alle gegevens zijn ontvangen. Bovendien kunt u door het parseren aan de serverzijde ongebruikte functies en extra code uitsluiten van de geretourneerde BinaryAST-representatie, wat, wanneer het aan de browserzijde wordt geparseerd, zowel tijd kost om te parseren als om extra verkeer te verzenden.

Een kenmerk van BinaryAST is ook de mogelijkheid om leesbaar JavaScript te herstellen dat niet overeenkomt met de originele versie, maar semantisch equivalent is en dezelfde namen van variabelen en functies bevat (BinaryAST slaat namen op, maar slaat geen informatie op over posities in de code, opmaak en opmerkingen). De andere kant van de medaille is de opkomst van nieuwe aanvalsvectoren, maar volgens de ontwikkelaars zijn deze veel kleiner en beter controleerbaar dan alternatieven zoals bytecodedistributie.

Codetests van Facebook.com hebben aangetoond dat 10-15% van de CPU-bronnen wordt besteed aan het parseren van JavaScript, en het parseren kost meer tijd dan het genereren van bytecodes en het genereren van initiële code voor JIT. In de SpiderMonkey-engine duurt de tijd om de AST-constructie te voltooien 500-800 ms, en het gebruik van BinaryAST verminderde dit cijfer met 70-90%.
Over het algemeen wordt voor het meeste webvuurwerk bij gebruik van BinaryAST de parseertijd van JavaScript met 3-10% verminderd in de modus zonder optimalisatie en met 90-97% wanneer de modus voor het negeren van ongebruikte functies is ingeschakeld.
Bij het uitvoeren van een JavaScript-testpakket van 1.2 MB versnelde het gebruik van BinaryAST de starttijd van het opstarten van 338 naar 314 ms op een desktopsysteem (Intel i7) en van 2019 naar 1455 ms op een mobiel apparaat (HTC One M8).

Bron: opennet.ru

Voeg een reactie