Cloudflare, Mozilla und Facebook entwickeln BinaryAST zur Beschleunigung des JavaScript-Loads

Ingenieure von Unternehmen wie Cloudflare, Mozilla, Facebook und Bloomberg haben vorgeschlagen neues Format BinaryAST zur Beschleunigung der Lieferung und Verarbeitung von JavaScript-Code beim Öffnen von Websites im Browser. BinaryAST verlagert die Phase der syntaktischen Analyse auf den Server und liefert bereits einen geformten abstrakten Syntaxbaum (AST). Beim Erhalt von BinaryAST kann der Browser sofort zur Kompilierungsphase übergehen, ohne die Quellcode-Analyse von JavaScript durchzuführen.

Zur Durchführung von Tests eine eine Referenzimplementierung, die unter der MIT-Lizenz bereitgestellt wird. Zum Parsen werden Komponenten von Node.js verwendet, und der Code zur Optimierung und Erzeugung des AST ist in Rust geschrieben. Auf der Browserseite ist die Unterstützung
von BinaryAST bereits in nächtlichen Builds Firefox verfügbar. Der Encoder in BinaryAST kann sowohl auf der Ebene der Endanwendung eines Websites als auch zur Bündelung von Skripten von externen Websites auf der Proxy- oder Content Delivery Network-Seite angewendet werden. Der Prozess der Standardisierung von BinaryAST durch die Arbeitsgruppe ECMA TC39, hat bereits begonnen, nach dessen Abschluss wird das Format zusammen mit bestehenden Methoden zur Kompression von ausgeliefertem Inhalt, wie gzip und brotli, koexistieren können.

Cloudflare, Mozilla und Facebook entwickeln BinaryAST zur Beschleunigung des JavaScript-Loads

Cloudflare, Mozilla und Facebook entwickeln BinaryAST zur Beschleunigung des JavaScript-Loads

Eine erhebliche Zeit bei der Verarbeitung von JavaScript wird durch die Phase des Ladens und des Parsens des Codes benötigt. Angesichts der Tatsache, dass die Menge an geladenem JavaScript auf vielen beliebten Websites fast 10 MB erreicht (zum Beispiel 7,2 MB für LinkedIn, 7,1 MB für Facebook, 3,9 MB für Gmail), führt die anfängliche Verarbeitung von JavaScript zu signifikanten Verzögerungen. Die Parser-Phase im Browser wird ebenfalls verlangsamt, da eine vollständige AST-Konstruktion beim Laden des Codes nicht möglich ist (der Browser muss auf den Abschluss des Ladens von Codeblöcken warten, wie zum Beispiel das Ende von Funktionen, um die fehlenden Informationen für das Parsing der aktuellen Elemente zu erhalten).

Teilweise versucht man, das Problem durch die Bereitstellung von Code in minimierter und komprimierter Form sowie durch das Browser-Caching des generierten Bytecodes zu lösen. Auf modernen Websites wird der Code allerdings recht häufig aktualisiert, weshalb das Caching das Problem nur teilweise löst. Eine mögliche Lösung wäre WebAssembly, allerdings erfordert dies die Verwendung von expliziter Typisierung im Code und eignet sich nur schlecht für die Beschleunigung der Verarbeitung bereits bestehenden JavaScript-Codes.

Eine alternative Lösung besteht darin, vorgefertigten kompilierten Bytecode anstelle von JavaScript-Skripten zu liefern. Browser-Engine-Entwickler haben jedoch Bedenken, da es schwierig ist, externen Bytecode zu verifizieren. Die direkte Verarbeitung kann zu einer Fragmentierung des Webs führen, zusätzliche Sicherheitsbedrohungen hervorrufen und erfordert die Entwicklung eines universellen Bytecode-Formats.

BinaryAST integriert sich in das aktuelle Modell der Entwicklung und Bereitstellung von Code, ohne neuen Bytecode zu erstellen oder die JavaScript-Sprache zu ändern. Die Datenmenge im BinaryAST-Format ist vergleichbar mit komprimiertem, minifiziertem JavaScript-Code, und die Verarbeitungsgeschwindigkeit erhöht sich deutlich, da die Parsing-Phase der Quelltexte entfällt. Darüber hinaus ermöglicht das Format die Kompilierung zu Bytecode während des Ladens von BinaryAST, ohne dass die vollständige Datenübertragung abgeschlossen sein muss. Zudem kann das Server-seitige Parsing ungenutzte Funktionen und überflüssigen Code aus dem übermittelten BinaryAST-Bild ausschließen, wodurch beim Parsing im Browser Zeit für die Analyse und die Übertragung überflüssigen Traffics gespart wird.

Ein besonderes Merkmal von BinaryAST ist die Möglichkeit, lesbaren JavaScript-Code zu rekonstruieren, der nicht identisch mit dem ursprünglichen ist, aber semantisch äquivalent und dieselben Variablen- und Funktionsnamen enthält (BinaryAST bewahrt die Namen, speichert jedoch keine Positionierungsinformationen im Code, Formatierungen oder Kommentare). Die Kehrseite der Medaille ist das Auftreten neuer Angriffsmöglichkeiten, jedoch sind diese nach Ansicht der Entwickler signifikant geringer und besser kontrollierbar als bei der Verwendung von Alternativen wie der Verbreitung von Bytecode.

Code-Tests von facebook.com haben gezeigt, dass die Analyse von JavaScript 10–15 % der CPU-Ressourcen in Anspruch nimmt und das Parsen mehr Zeit erfordert als die Generierung von Bytecode und die anfängliche Codeerstellung für JIT. Im SpiderMonkey-Engine braucht der vollständige Aufbau des AST 500–800 ms, und die Anwendung von BinaryAST hat es ermöglicht, diese Zeit um 70–90 % zu reduzieren.
Insgesamt wird bei den meisten Web-Frameworks durch die Anwendung von BinaryAST die Parsing-Zeit für JavaScript um 3–10 % im Nicht-Optimierungsmodus und um 90–97 % im Modus zum Ignorieren ungenutzter Funktionen verkürzt.
Bei der Ausführung eines 1,2 MB großen JavaScript-Testsets ermöglichte BinaryAST eine Beschleunigung der Startzeit auf einem Desktop-System (Intel i7) von 338 auf 314 ms und auf einem Mobilgerät (HTC One M8) von 2019 auf 1455 ms.

Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster