JITなしのV8
V8 v7.4は、実行時に実行可能なメモリを割り当てずにJavaScriptを実行することをサポートします。
デフォルト設定では、V8は実行時に実行可能なメモリを割り当てたり変更したりする機能に大きく依存しています。例えば、TurboFan最適化コンパイラはホットなJavaScript(JS)関数に対してネイティブコードをリアルタイムに生成し、多くのJS正規表現はirregexpエンジンによってネイティブコードにコンパイルされます。実行時に実行可能なメモリを作成することは、V8を高速にする要因の一つです。
しかし、特定の状況では、実行可能なメモリを割り当てずにV8を実行することが望ましい場合があります。
- 一部のプラットフォーム(例: iOS、スマートテレビ、ゲームコンソール)は非特権アプリケーションに対して実行可能なメモリへの書き込みアクセスを禁止しており、これまでそのプラットフォームでV8を使用することは不可能でした。
- 実行可能なメモリへの書き込みを禁止することで、アプリケーションの攻撃対象領域が減少します。
V8の新しい「JITなし」モードはこれらの問題に対応することを目的としています。V8が--jitless
フラグを使用して起動されると、V8は実行可能なメモリを実行時に割り当てずに動作します。
どのように動作するのでしょうか?基本的に、V8は既存の技術に基づいてインタープリターモードに切り替わります。すべてのJSユーザーコードがIgnitionインタープリターを通じて実行され、正規表現のパターンマッチングも同様に解釈されます。現在、WebAssemblyはサポートされていませんが、解釈も可能性の範疇にあります。V8のビルトインは依然としてネイティブコードにコンパイルされていますが、最近の取り組みによってV8バイナリ内に埋め込まれるようになりましたため、もはや管理されたJSヒープの一部ではありません。
最終的に、これらの変更により、V8のヒープをいずれのメモリ領域にも実行権限を必要とせずに作成することが可能になりました。
結果
「JITなし」モードでは最適化コンパイラが無効化されるため、パフォーマンスにペナルティが生じます。V8のパフォーマンス特性がどのように変化するかを理解するために、多様なベンチマークを調査しました。Speedometer 2.0は典型的なウェブアプリケーションを表し、Web Tooling Benchmarkには一般的なJS開発ツールのセットが含まれています。また、YouTubeリビングルームアプリでのブラウジングワークフローをシミュレートするベンチマークも含めています。すべての測定はx64 Linuxデスクトップ上で5回実行し、ローカルで行いました。
Speedometer 2.0は「JITなし」モードでは約40%遅くなります。回帰のうち約半分は最適化コンパイラが無効化されたことに起因します。残りの半分は正規表現インタープリターによるもので、これは元々デバッグ支援を目的としており、今後性能改善が行われる予定です。
Web Tooling BenchmarkはTurboFanで最適化されたコードに多くの時間を費やす傾向があるため、「JITなし」モードが有効になると80%の大きな回帰を示します。
最後に、YouTubeリビングルームアプリでの動画再生とメニュー操作を含むシミュレートされたブラウジングセッションを測定しました。ここでは「JITなし」モードでもほぼ同等で、標準のV8構成と比較してJS実行にはわずか6%の遅延しかありません。このベンチマークは、最適化されたコードのピーク性能が必ずしも現実の性能に相関するわけではないことを示しており、多くの状況で埋め込み開発者は「JITなし」モードでも合理的な性能を維持できます。
メモリ消費はわずかに変化し、代表的なウェブサイトセットをロードした場合、V8のヒープサイズが中央値で1.7%減少しました。
制限のあるプラットフォームや特別なセキュリティ要件を備えた埋め込み開発者が、V8の新しい「JITなし」モードを検討することをお勧めします。V8 v7.4で利用可能です。ご質問やフィードバックは、v8-usersディスカッショングループまでどうぞ。
FAQ
--jitless
と--no-opt
の違いは何ですか?
--no-opt
はTurboFan最適化コンパイラを無効化します。--jitless
は実行可能なメモリの実行時割り当てをすべて無効化します。