JavaScript V8エンジンの最新バージョンであるV8 9.1は、Sparkplugと呼ばれる新しい中間コンパイラのステージを導入している。実際のベンチマークでのパフォーマンスを5~15%向上させるとV8エンジニアのLeszek Swirskiは述べている。今後リリースされるChrome 91で利用できるようになる。
古いV8アーキテクチャには、JavaScriptインタープリタであるIgnitionと高度に最適化するコンパイラであるTurboFanの2つのステージのみが含まれていた。IgnitionはJavaScript ASTを使ってV8バイトコードを生成し、TurboFanはそこからマシンコードを生成できる。Sparkplugが導入された理由は、Sparkplugの設計概要で明確に説明されている。
[IgnitionとTurboFan]の間には大きなパフォーマンスの壁があります。インタープリタに長く留まるということは、最適化のメリットを享受できないことを意味するが、TurboFanの呼び出しが早すぎると、実際にはホットではない関数の最適化に時間を「浪費」する可能性があります。さらに悪い場合には、最適化しないことを意味します。シンプルで高速な最適化しないコンパイラを使用すると、このギャップを減らすことができます。コンパイラは、バイトコードを直線的に走査してマシンコードを吐き出すことで、インタプリタからすばやく安価に1レベルアップできます。このコンパイラをSparkplugと呼びます。
IgnitionとTurboFanが導入される前は、V8にはFull-CodeGen(FCG)と呼ばれる高速なJITコンパイラがあった。LeszekがHacker Newsのスレッドで説明しているように、これは見捨てられ、FCGを含まないIgnitionと呼ばれる新しいインタープリタアーキテクチャが支持された。
大きな違いは、Sparkplugがソースからではなくバイトコードからコンパイルされることです。そのため、バイトコードは、プログラムについて、信頼できる唯一の情報源のままとなります。FCGの時代には、最適化コンパイラはソースコードをASTに再解析し、そこからコンパイルする必要がありました。さらに悪いことに、FCGに最適化を解除できるようにするには、最適化しないスタックフレームを正しく取得するためにFCGコンパイルに対して「再生」のようなことをする必要がありました。
Leszekは、FCGは、その膨大な技術的負債のために進化するのではなく、見捨てられたと述べている。これは、特に、IgnitionコンパイラとFCGの両方がソースからコンパイルし、出力をTurboFanに提供する必要があり、あらゆる種類の複雑さをもたらしたことによる。これにより、JavaScriptの新機能に付いていくのも難しくなった。
Sparkplugの速度には2つの要因があるとSwirski氏は言っている。まず、Ignitionによって生成されたバイトコードに依存する。これは、変数の解決、括弧が実際にアロー関数であるかどうかの把握、分割代入構文の脱糖など、多くの作業がすでに行われていることを意味する。さらに、Sparkplugは中間表現(IR)を生成せず、単一の線形パスでマシンコードを出力する。このアプローチは、SparkplugがIRに基づく高度な最適化を行うことができず、新しい各プラットフォームに完全に移植する必要があることを意味する。
パフォーマンスに関しては、Sparkplugは、Speedometerと、V8チームが使用する一連の実際のベンチマークの両方で改善されている。改善は、テストマシンとWebサイトに応じて5~15%の範囲です。Googleは、さまざまなパイプラインコンポーネントのパフォーマンスを比較する公式の低レベルベンチマークをリリースしていない。ただし、Leszekは次のように説明している。
コンパイル時間は、Ignitionコンパイルとほぼ同じ桁数(ASTからバイトコードまでで、解析を除く)であり、TurboFanよりも約2~3桁高速です。他の関係者がコメントで指摘しているように、インタプリタに対する相対的なパフォーマンスはワークロードによって大きく異なりますが、全体がプロパティの負荷によって占められていないものについては、おそらく4倍程度が適切な概算です。
V8の設計者によると、パフォーマンスに加えて、Sparkplugのもう1つの重要な利点は、CPU使用率の削減である。これにより、モバイルデバイスのバッテリー使用量が改善され、ペイパーサイクルサーバの請求額も削減される。
前述のように、Sparkplugは現在Chrome 91で展開されているため、間もなく使ってみることができる。Sparkplugの内部の詳細と、IgnitionとTurboFanとのインターフェース方法に興味がある場合は、Swirskiの記事をお見逃しなく。