Cloudflare, Mozilla und Facebook entwickeln BinaryAST, um das Laden von JavaScript zu beschleunigen.

Ingenieure von Cloudflare, Mozilla, Facebook und Bloomberg haben neues Format BinaryAST zum Beschleunigen der Lieferung und Verarbeitung von JavaScript-Code beim Öffnen von Websites im Browser. BinaryAST verlagert die Parsing-Phase auf den Server und liefert bereits ein formatiertes abstraktes Syntaxbaum (AST). Beim Erhalt von BinaryAST kann der Browser sofort zur Kompilierungsphase übergehen und das Parsen des Quell-JavaScripts überspringen.

Für Tests wurde vorbereitet die Referenzimplementierung, die unter der MIT-Lizenz bereitgestellt wird. Zum Parsen werden Komponenten von Node.js verwendet, während der Code zur Optimierung und Erstellung des AST in Rust geschrieben ist. Die Unterstützung für
BinaryAST ist bereits in nächtlichen Builds Firefox verfügbar. Der Encoder in BinaryAST kann sowohl auf der Ebene der Werkzeugkette der Zielwebsite als auch zur Verpackung von Scripts externer Websites auf der Proxy- oder Content Delivery Network-Seite verwendet werden. Der Standardisierungsprozess von BinaryAST durch die Arbeitsgruppe ECMA TC39, hat bereits begonnen, nach dessen Abschluss wird das Format neben bestehenden Methoden zur Kompression der ausgegebenen Inhalte wie gzip und brotli koexistieren können.

Cloudflare, Mozilla und Facebook entwickeln BinaryAST, um das Laden von JavaScript zu beschleunigen.

Cloudflare, Mozilla und Facebook entwickeln BinaryAST, um das Laden von JavaScript zu beschleunigen.

Ein erheblicher Teil der Zeit, die zur Verarbeitung von JavaScript benötigt wird, entfällt auf das Laden und Parsen des Codes. Angesichts der Tatsache, dass das Volumen des geladenen JavaScripts auf vielen beliebten Websites fast 10 MB erreicht (zum Beispiel LinkedIn – 7,2 MB, Facebook – 7,1 MB, Gmail – 3,9 MB) verursacht die anfängliche Verarbeitung von JavaScript erhebliche Verzögerungen. Die Parsing-Phase im Browser wird zudem dadurch verlangsamt, dass ein vollständiger AST nicht „on-the-fly“ aufgebaut werden kann, während der Code geladen wird (der Browser muss auf den Abschluss des Ladens von Codeblöcken warten, zum Beispiel das Ende von Funktionen, um fehlende Informationen für das Parsen der aktuellen Elemente zu erhalten).

Teilweise wird versucht, das Problem durch die Verbreitung von Code in minimierter und komprimierter Form sowie durch das Caching von generiertem Bytecode im Browser zu lösen. Auf modernen Websites wird der Code recht häufig aktualisiert, daher löst das Caching das Problem nur teilweise. Eine Lösung könnte WebAssembly sein, jedoch erfordert es die Verwendung von expliziter Typisierung im Code und ist schlecht geeignet zur Beschleunigung der Verarbeitung bereits bestehenden JavaScripts.

Eine andere Möglichkeit ist die Lieferung von bereit kompilierter Bytecode anstelle von JavaScript-Skripten, aber die Entwickler von Browser-Engines lehnen dies ab, da Dritthersteller-Bytecode schwer zu verifizieren ist, seine direkte Verarbeitung zu einer Fragmentierung des Webs führen kann und zusätzliche Sicherheitsbedrohungen entstehen. Außerdem ist die Entwicklung eines universellen Bytecode-Formats erforderlich.

BinaryAST fügt sich in das aktuelle Modell der Entwicklung und Bereitstellung von Code ein, ohne neue Bytecodes zu schaffen und ohne die Programmiersprache JavaScript zu ändern. Die Datenmenge im BinaryAST-Format ist mit komprimiertem, minifiziertem JavaScript-Code vergleichbar, und die Verarbeitungszeit wird durch den Wegfall der Parsing-Phase der Quelltexte erheblich verkürzt. Zudem ermöglicht das Format, die Kompilierung zu Bytecode während des Ladens von BinaryAST durchzuführen, ohne auf den Abschluss der Datenübertragung zu warten. Darüber hinaus erlaubt das Parsing auf der Serverseite das Herausnehmen nicht verwendeter Funktionen und überflüssigen Codes aus der gelieferten Darstellung von BinaryAST, für die bei einem Parsing auf der Client-Seite Zeit sowohl für die Analyse als auch für die Übertragung überflüssigen Datenverkehrs aufgewendet wird.

Eine Besonderheit von BinaryAST ist auch die Möglichkeit, lesbaren JavaScript-Code wiederherzustellen, der nicht eins zu eins mit der Originalversion übereinstimmt, sondern semantisch äquivalent ist und dieselben Variablen- und Funktionsnamen enthält (BinaryAST speichert die Namen, behält jedoch keine Informationen über Positionen im Code, Formatierungen oder Kommentare). Auf der anderen Seite entstehen neue Angriffsvektoren, aber laut den Entwicklern sind diese erheblich geringer und besser kontrollierbar als bei der Anwendung von Alternativen wie der Verbreitung von Bytecode.

Code-Tests von facebook.com haben gezeigt, dass für das Parsing von JavaScript 10-15 % der CPU-Ressourcen aufgewendet werden und das Parsing mehr Zeit in Anspruch nimmt als die Generierung von Bytecode und die anfängliche Codeerstellung für JIT. Im SpiderMonkey-Engine dauert der gesamte Aufbau des AST 500-800 ms, und die Anwendung von BinaryAST hat es ermöglicht, diesen Wert um 70-90 % zu reduzieren.
Insgesamt wird die Zeit für das Parsen von JavaScript bei den meisten Web-Frameworks mit der Anwendung von BinaryAST um 3-10 % im nicht optimierten Modus und um 90-97 % im Modus zur Ignorierung nicht verwendeter Funktionen verkürzt.
Bei der Ausführung eines Test-JavaScript-Sets mit einer Größe von 1,2 MB ermöglichte die Anwendung von BinaryAST, die Startzeit von 338 ms auf 314 ms auf einem Desktop-System (Intel i7) und von 2019 ms auf 1455 ms auf einem mobilen Gerät (HTC One M8) zu beschleunigen.

Quelle: opennet.ru

60GB SSD 8Gb DDR4