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

Ingenieure von Cloudflare, Mozilla, Facebook und Bloomberg vorgeschlagen neues Format BinärAST um die Bereitstellung und Verarbeitung von JavaScript-Code beim Öffnen von Websites im Browser zu beschleunigen. BinaryAST verlagert die Parsing-Phase auf die Serverseite und stellt einen bereits generierten abstrakten Syntaxbaum bereit (AST). Nach dem Empfang eines BinaryAST kann der Browser sofort mit der Kompilierungsphase fortfahren und das Parsen des JavaScript-Quellcodes umgehen.

Zum Prüfen vorbereitet von Referenzimplementierung, die unter der MIT-Lizenz bereitgestellt wird. Node.js-Komponenten werden zum Parsen verwendet und der Code für die Optimierung und AST-Generierung ist in Rust geschrieben. Browserseitige Unterstützung
BinaryAST ist bereits verfügbar in nächtliche Bauten Feuerfuchs. Der Encoder in BinaryAST kann sowohl auf der End-Site-Tooling-Ebene als auch zum Packen von Skripten externer Sites auf der Seite eines Proxy- oder Content-Delivery-Netzwerks verwendet werden. Derzeit hat der Prozess der Standardisierung von BinaryAST durch die Arbeitsgruppe bereits begonnen ECMA TC39Danach kann das Format mit vorhandenen Inhaltskomprimierungsmethoden wie gzip und brotli koexistieren.

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

Bei der Verarbeitung von JavaScript wird viel Zeit in die Lade- und Analysephase des Codes investiert. Wenn man bedenkt, dass das Volumen des heruntergeladenen JavaScripts auf vielen beliebten Websites etwa 10 MB beträgt (z. B. für LinkedIn – 7.2 MB, Facebook – 7.1 MB, Gmail – 3.9 MB), führt die anfängliche Verarbeitung von JavaScript zu einer erheblichen Verzögerung. Auch die Parsing-Phase auf der Browserseite wird verlangsamt, da der AST beim Laden des Codes nicht vollständig im laufenden Betrieb erstellt werden kann (der Browser muss warten, bis der Ladevorgang der Codeblöcke abgeschlossen ist, z. B. das Ende von Funktionen). die Informationen, die zum Parsen der aktuellen Elemente fehlen).

Sie versuchen, das Problem teilweise zu lösen, indem sie den Code in minimierter und komprimierter Form verteilen und den vom Browser generierten Bytecode zwischenspeichern. Auf modernen Websites wird der Code häufig aktualisiert, sodass das Problem durch Caching nur teilweise gelöst wird. WebAssembly könnte eine Lösung sein, erfordert jedoch eine explizite Eingabe des Codes und ist nicht gut geeignet, die Verarbeitung von vorhandenem JavaScript-Code zu beschleunigen.

Eine andere Möglichkeit besteht darin, vorgefertigten kompilierten Bytecode anstelle von JavaScript-Skripten bereitzustellen. Entwickler von Browser-Engines sind jedoch dagegen, da Bytecode von Drittanbietern schwer zu überprüfen ist, seine direkte Verarbeitung zu einer Webschichtung führen kann, zusätzliche Sicherheitsrisiken entstehen und die Entwicklung von Es ist ein universelles Bytecode-Format erforderlich.

Mit BinaryAST können Sie sich an Ihr aktuelles Code-Entwicklungs- und Bereitstellungsmodell anpassen, ohne neuen Bytecode zu erstellen oder die JavaScript-Sprache zu ändern. Die Datengröße im BinaryAST-Format ist vergleichbar mit komprimiertem minimiertem JavaScript-Code, und die Verarbeitungsgeschwindigkeit erhöht sich durch den Wegfall der Quelltext-Parsing-Phase deutlich. Darüber hinaus ermöglicht das Format die Kompilierung in Bytecode beim Laden von BinaryAST, ohne auf den Abschluss aller Daten warten zu müssen. Darüber hinaus können Sie durch das Parsen auf der Serverseite ungenutzte Funktionen und unnötigen Code aus der zurückgegebenen BinaryAST-Darstellung ausschließen, was beim Parsen auf der Browserseite Zeit sowohl für das Parsen als auch für die Übertragung unnötigen Datenverkehrs verschwendet.

Eine Funktion von BinaryAST ist auch die Möglichkeit, lesbares JavaScript wiederherzustellen, das nicht genau mit der Originalversion übereinstimmt, aber semantisch äquivalent ist und dieselben Namen von Variablen und Funktionen enthält (BinaryAST speichert Namen, speichert jedoch keine Informationen über Positionen in Code, Formatierung und Kommentare). Die Kehrseite der Medaille ist das Aufkommen neuer Angriffsvektoren, die laut den Entwicklern jedoch deutlich kleiner und besser kontrollierbar sind als bei der Nutzung von Alternativen, etwa der Bytecode-Verteilung.

Tests des facebook.com-Codes zeigten, dass das Parsen von JavaScript 10–15 % der CPU-Ressourcen verbraucht und das Parsen mehr Zeit in Anspruch nimmt als die Generierung von Bytecode und die anfängliche Codegenerierung für JIT. In der SpiderMonkey-Engine dauert die vollständige Erstellung eines AST 500–800 ms, und durch die Verwendung von BinaryAST konnte dieser Wert um 70–90 % reduziert werden.
Im Allgemeinen wird bei den meisten Web-Feuerwerken bei Verwendung von BinaryAST die JavaScript-Parsing-Zeit im Modus ohne Optimierung um 3–10 % und bei aktiviertem Modus zum Ignorieren nicht verwendeter Funktionen um 90–97 % reduziert.
Bei der Ausführung eines 1.2 MB großen JavaScript-Testsatzes konnte mit BinaryAST die Startzeit auf einem Desktop-System (Intel i338) von 314 auf 7 ms und auf einem mobilen Gerät (HTC One M2019) von 1455 auf 8 ms beschleunigt werden.

Source: opennet.ru

Kommentar hinzufügen