高速なブラウザを提供するうえで重要な要素は、JavaScript を高速に実行することです。Chrome では、この作業を V8 エンジンが行っており、毎日 78 年分以上に相当する JavaScript コードが実行されています。M91 Chrome では、
新しい Sparkplug コンパイラと
ショート ビルトイン呼び出しがリリースされ、最大 23% の高速化が実現し、毎日 17 年分以上に相当するユーザーの CPU 時間を節約できています。Sparkplug は新しい JavaScript コンパイラで、短時間で実行を開始する必要性と、コードが最大限のパフォーマンスを発揮するための最適化との間にあったギャップを埋めるものです。ショート ビルトイン呼び出しでは、生成したコードをメモリに格納する場所を最適化することで、関数を呼び出す際の間接ジャンプを回避します。
Sparkplug
V8 エンジンには複数のコンパイラがあり、JavaScript 実行のさまざまなフェーズでトレードオフを使い分けることができます。3 年前に、
Ignition と Turbofan で構成される新しい 2 層コンパイラ システムを導入しました。Ignition はバイトコード インタプリタで、できる限り遅延なく JavaScript の実行を開始する役割を担います。Turbofan は最適化をするコンパイラで、JavaScript の実行中に収集される情報に基づいて高パフォーマンスなマシンコードを生成します。そのため、起動は Ignition のバイトコード コンパイラよりも遅くなります。Sparkplug は Ignition と Turbofan のバランスをとったもので、ネイティブのマシンコードを生成しますが、JavaScript コードの実行中に集める情報には依存しません。そのため、すぐに実行を開始できるうえに、比較的高速なコードを生成できます。この新しいエンジンに使われている技術の詳細については、
V8 ブログ投稿をご覧ください。
ショート ビルトイン
ショート ビルトインは、V8 エンジンが生成したコードをメモリに格納する場所を最適化する仕組みです。V8 が JavaScript から CPU 固有のコードを生成すると、そのコードはメモリに配置されます。多くの場合、この生成されたコードはビルトイン関数を呼び出します。ビルトイン関数は、2 つの変数の加算などの基本的な演算から JavaScript 標準ライブラリの本格的な関数まで、あらゆる一般的なルーチンを処理する小さなコード スニペットです。CPU によっては、生成されたコードから離れた場所にある関数を呼び出すと、CPU 内部の最適化(分岐予測ロジックなど)が失敗する場合があります。これを防ぐには、生成されたコードと同じメモリ領域にビルトイン関数をコピーします。この変更は、新しい Apple M1 チップで特に大きな効果を発揮します。この機能によるさまざまなプラットフォームへの影響の詳細については、
V8 ブログ投稿をご覧ください。
今後もさまざまなパフォーマンスの改善についてお知らせしますので、ご期待ください。