Cloudflare、Mozilla、Facebook は JavaScript の読み込みを高速化する BinaryAST を開発

Cloudflare、Mozilla、Facebook、Bloomberg のエンジニア 提案された 新しい形式 バイナリAST ブラウザでサイトを開くときの JavaScript コードの配信と処理を高速化します。 BinaryAST は、解析フェーズをサーバー側に移し、すでに生成された抽象構文ツリーを提供します (AST)。 BinaryAST を受信すると、ブラウザは JavaScript ソース コードの解析をバイパスして、すぐにコンパイル段階に進むことができます。

テスト用 準備 MIT ライセンスに基づいて提供されるリファレンス実装。 Node.js コンポーネントは解析に使用され、最適化と AST 生成のためのコードは Rust で記述されます。 ブラウザ側のサポート
BinaryAST はすでに利用可能です 夜間のビルド ファイアーフォックス。 BinaryAST のエンコーダーは、エンド サイト ツール レベルと、プロキシまたはコンテンツ配信ネットワーク側の外部サイトのスクリプトのパッケージ化の両方で使用できます。 現在、ワーキンググループによる BinaryAST の標準化プロセスがすでに始まっています。 ECMA TC39、その後、この形式は gzip や brotli などの既存のコンテンツ圧縮方法と共存できるようになります。

Cloudflare、Mozilla、Facebook は JavaScript の読み込みを高速化する BinaryAST を開発

Cloudflare、Mozilla、Facebook は JavaScript の読み込みを高速化する BinaryAST を開発

JavaScript を処理する場合、コードの読み込みと解析のフェーズにかなりの時間がかかります。 多くの人気サイトでダウンロードされる JavaScript の量が 10 MB 近くであることを考慮すると (たとえば、LinkedIn - 7.2 MB、Facebook - 7.1 MB、Gmail - 3.9 MB)、JavaScript の初期処理で大幅な遅延が発生します。 コードのロード時に AST をオンザフライで完全に構築できないため、ブラウザ側の解析ステージも遅くなります (ブラウザは、関数の終わりなど、コード ブロックのロードが完了するまで待機して、データを取得する必要があります)現在の要素を解析するには情報が不足しています)。

彼らは、コードを最小化および圧縮した形式で配布し、ブラウザによって生成されたバイトコードをキャッシュすることによって、問題を部分的に解決しようとしています。 最近のサイトではコードが頻繁に更新されるため、キャッシュでは問題が部分的にしか解決されません。 WebAssembly は解決策になる可能性がありますが、コードに明示的に入力する必要があり、既存の JavaScript コードの処理の高速化にはあまり適していません。

もう XNUMX つのオプションは、JavaScript スクリプトの代わりに既製のコンパイル済みバイトコードを提供することですが、サードパーティのバイトコードは検証が難しく、その直接処理は Web の階層化につながる可能性があり、追加のセキュリティ リスクが発生し、また、ユニバーサルバイトコード形式が必要です。

BinaryAST を使用すると、新しいバイトコードを作成したり JavaScript 言語を変更したりせずに、現在のコード開発および配信モデルに適合させることができます。 BinaryAST 形式のデータのサイズは、圧縮されて縮小された JavaScript コードに匹敵し、ソース テキストの解析フェーズが不要になるため、処理速度が大幅に向上します。 さらに、この形式では、BinaryAST がロードされるときに、すべてのデータが完了するのを待たずにバイトコードにコンパイルできます。 さらに、サーバー側で解析すると、返された BinaryAST 表現から未使用の関数や不要なコードを除外できます。これにより、ブラウザ側で解析すると、不要なトラフィックの解析と送信の両方で時間が無駄になります。

BinaryAST の機能は、元のバージョンとまったく同じではないが、意味的に同等であり、同じ名前の変数と関数を含む、読み取り可能な JavaScript を復元する機能でもあります (BinaryAST は名前を保存しますが、ファイル内の位置に関する情報は保存しません)。コード、フォーマット、コメントなど)。 コインの裏返しとして、新しい攻撃ベクトルの出現がありますが、開発者によれば、それらはバイトコード配布などの代替手段を使用する場合よりもはるかに小さく、制御しやすいとのことです。

facebook.com コードのテストでは、JavaScript の解析が CPU リソースの 10 ~ 15% を消費し、解析にはバイトコードの生成や JIT の初期コード生成よりも時間がかかることがわかりました。 SpiderMonkey エンジンでは、AST を完全に構築するのに 500 ~ 800 ミリ秒かかりますが、BinaryAST の使用により、この数値が 70 ~ 90% 削減されました。
一般に、ほとんどの Web Fireworks では、BinaryAST を使用すると、最適化なしのモードでは JavaScript の解析時間が 3 ~ 10% 短縮され、未使用の関数を無視するモードが有効な場合は 90 ~ 97% 短縮されます。
1.2 MB の JavaScript テスト セットを実行する場合、BinaryAST を使用すると、デスクトップ システム (Intel i338) では起動時間が 314 ミリ秒から 7 ミリ秒に、モバイル デバイス (HTC One M2019) では 1455 ミリ秒から 8 ミリ秒に高速化できました。

出所: オープンネット.ru

コメントを追加します