メインコンテンツまでスキップ

V8はこれまで以上に速く、安全です!

· 約9分
[Victor Gomes](https://twitter.com/VictorBFG)、グリューワインの専門家

速さが単なる特徴ではなく、生活の一部である刺激的なV8の世界へようこそ。2023年を締めくくるにあたり、今年達成したV8の印象的な成果を祝う時が来ました。

革新的なパフォーマンス最適化を通じて、V8はWebの進化し続ける景観において可能な限界を押し広げ続けています。今年は、新しい中間層コンパイラを導入し、上位層コンパイラのインフラストラクチャ、ランタイム、ガベージコレクタにいくつかの改善を実施しました。その結果、広範囲で大幅な速度向上が実現しました。

パフォーマンスの向上に加え、JavaScriptとWebAssemblyの両方にエキサイティングな新機能を追加しました。また、WebAssembly Garbage Collection (WasmGC)を使用して、効率的にWebにガベージコレクション対応言語を導入する新しいアプローチを採用しました。

さらに、私たちの卓越への献身はそこでは止まりません – 私たちは安全性も最優先しています。サンドボックスインフラストラクチャを改善し、V8にControl-flow Integrity (CFI)を導入することで、ユーザーにより安全な環境を提供しました。

以下に、今年の主なハイライトをまとめました。

Maglevという名前の新しい最適化コンパイラを導入しました。このコンパイラは、既存のSparkplugTurboFanの間に戦略的に配置され、非常に高速な最適化コンパイラとして効率的かつ卓越した速度で最適化されたコードを生成します。Maglevは、基準となる非最適化コンパイラSparkplugより20倍遅く、上位層コンパイラTurboFanより10~100倍速くコードを生成します。Maglevにより、JetStreamが8.2%向上し、Speedometerが6%向上するなど、大幅なパフォーマンス向上が観察されました。高速なコンパイル速度とTurboFanへの依存の削減により、SpeedometerのランにおけるV8の全体消費エネルギーが10%節約されました。完全ではありませんが、現在の状態はChrome 117での導入を正当化します。詳細はブログ投稿にて。

Turboshaft: 上位層の最適化コンパイラ向け新アーキテクチャ

Maglevだけが改善されたコンパイラ技術への投資ではありません。上位層の最適化コンパイラTurbofanに新しい内部アーキテクチャTurboshaftを導入しました。これにより、新しい最適化の拡張が容易になり、コンパイル速度も向上しています。Chrome 120以降では、CPU非依存のバックエンドフェーズはすべてTurboshaftを使用しており、従来のTurbofanの約2倍の速度でコンパイルしています。これによりエネルギーが節約され、来年以降さらにエキサイティングなパフォーマンス向上への道が開かれています。今後の更新にご期待ください!

高速なHTMLパーサー

ベンチマーク時間のかなりの部分がHTML解析に費やされることを確認しました。V8の直接的な強化ではありませんが、パフォーマンス最適化の専門知識を活用し、Blinkに高速なHTMLパーサーを追加しました。これらの変更により、Speedometerのスコアが3.4%向上しました。この改良はChromeに非常に大きなポジティブな影響を与えたため、WebKitプロジェクトはこれらの変更をリポジトリに迅速に統合しました。Webの高速化という共同目標に貢献できることを誇りに思います!

高速なDOM割り当て

また、DOM側への積極的な投資も行っています。Oilpan - DOMオブジェクトの割り当て用アロケータにおけるメモリ割り当て戦略の最適化を行いました。ページプールを導入し、カーネルへの往復のコストを大幅に削減しました。Oilpanは圧縮ポインタと非圧縮ポインタの両方をサポートし、Blinkで高頻度で使用するフィールドの圧縮を回避しています。解凍が頻繁に行われるため、これはパフォーマンスに広範な影響を与えました。さらに、アロケータが速いとわかったことで、頻繁に割り当てられるクラスを油田化し、割り当ての作業負荷を3倍高速化し、SpeedometerのようなDOMを多用するベンチマークで大幅な改善を示しました。

新しいJavaScript機能

JavaScriptは新たに標準化された機能により進化を続けており、今年も例外ではありませんでした。我々はサイズ変更可能なArrayBuffersArrayBufferの転送、文字列のisWellFormedtoWellFormed正規表現のvフラグ(別名Unicodeセット表記)、JSON.parseのsourceオプション配列のグループ化Promise.withResolvers、そしてArray.fromAsyncを導入しました。残念ながら、イテレーターのヘルパーにウェブ互換性の問題が発見されたため導入を取りやめましたが、TC39と協力して問題を修正し、近いうちに再導入する予定です。最後に、letconst束縛に対しいくつかの冗長な時間的デッドゾーンチェックを省略することでES6+ JSコードを高速化しました。

WebAssemblyのアップデート

今年、Wasmに関する多くの新機能やパフォーマンス改善が実現しました。マルチメモリテールコール(詳細は当社ブログ記事をご覧ください)、およびリラックスされたSIMDのサポートを有効化し、次世代のパフォーマンスを解き放ちました。memory64もメモリを大量消費するアプリケーションのために実装を終え、提案がフェーズ4に達するのを待っています。また、例外処理提案の最新アップデートを取り入れつつ、以前のフォーマットもサポートしました。そして、JSPIに投資を続けることで、ウェブ上でさらに多くの新たなアプリケーションクラスを可能にすることを目指しています。来年もご期待ください!

WebAssemblyガベージコレクション

ウェブに新たなアプリケーションクラスをもたらすという点に関連して、数年にわたる提案の標準化および実装の努力を経て、ついにWebAssemblyガベージコレクション(WasmGC)を導入しました。Wasmは、V8の既存のガベージコレクターによって管理されるオブジェクトや配列を割り当てるための組み込み機能を持つようになりました。それにより、Java、Kotlin、Dartなどのガベージコレクションを利用する言語で書かれたアプリケーションをWasmにコンパイルすることが可能になります。これらは通常JavaScriptにコンパイルする場合の約2倍の速度で動作します。詳細は当社ブログ記事をご覧ください。

セキュリティ

セキュリティ面では、今年の主なトピックはサンドボックス化、ファジング、そしてCFIでした。サンドボックス化の面では、コードテーブルや信頼できるポインタテーブルといった欠けているインフラの構築に注力しました。ファジングに関しては、インフラ構築から特殊用途のファジングツールや言語カバレッジの向上まで投資を行いました。これらの取り組みの一部はこちらのプレゼンテーションでご紹介しています。最後に、CFI関連ではCFIアーキテクチャの基盤を築き、可能な限り多くのプラットフォームで実現できるようにしました。この他にも、一般的な攻撃手法を回避するための取り組みや、V8CTFと呼ばれる新しいエクスプロイト賞金プログラムの開始など、小規模ながら注目すべき努力も含まれています。

結論

今年を通じて、数多くのインクリメンタルなパフォーマンス向上に取り組みました。これらの小規模プロジェクトとブログ記事で詳述したものの総合的な影響は非常に大きいです!以下は、2023年に達成されたV8のパフォーマンス向上を示すベンチマークスコアで、JetStreamでは14%、Speedometerでは驚異的な34%の成長を遂げました。

13インチM1 MacBook Proで測定されたウェブ性能ベンチマーク。

これらの結果は、V8がかつてないほど高速かつ安全であることを示しています。開発者の皆さん、準備を整えてください。V8との旅は、速くそして激しいウェブの探検が始まったばかりです!我々はV8を地球上最高のJavaScriptとWebAssemblyエンジンであり続けるよう取り組み続けます!

V8の全スタッフから、ウェブの旅路で高速、安全、そして素晴らしい体験に満ち溢れた喜びのホリデーシーズンをお過ごしいただけますようお祈りしています!