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

V8リリース v6.8

· 約5分
V8チーム

6週間ごとに、リリースプロセスの一環として新しいV8のブランチを作成します。各バージョンは、Chrome Betaのマイルストーン直前にV8のGitマスターから分岐します。本日、最新のブランチV8バージョン6.8を発表できることを嬉しく思います。このバージョンは数週間後にChrome 68 Stableと連携してリリースされるまでベータ版で提供されます。V8 v6.8には、多くの開発者向けの機能が満載されています。この投稿では、リリースを前にいくつかのハイライトをご紹介します。

メモリ

JavaScript関数は不要に外側の関数とそのメタデータ(SharedFunctionInfoまたはSFIとして知られる)を保持していました。特に短命のIIFE(即時呼び出し関数式)に依存する関数が多いコードでは、これが原因で間欠的なメモリリークが発生することがありました。この変更前では、アクティブなContext(関数実行のヒープ上の表現)は、コンテキストを作成した関数のSFIを保持していました:

Contextがデバッグに必要な簡易化された情報を含むScopeInfoオブジェクトを指すことで、SFIへの依存関係が解消されます。

モバイルデバイスのトップ10ページのセットで、すでに3%のV8メモリ改善を観測しています。

同時に、SFI自体のメモリ消費を削減し、不必要なフィールドを削除したり、可能な場合に圧縮したりして、そのサイズを約25%削減しました。将来のリリースではさらに削減が予定されています。典型的なWebサイトでは、SFIがV8メモリの2〜6%を占めていますので、多くの関数を持つコードでもメモリ改善が見られるはずです。

パフォーマンス

配列分解の改良

最適化コンパイラは配列分解のための理想的なコードを生成していませんでした。例えば、[a, b] = [b, a]を使用して変数を交換するのは、const tmp = a; a = b; b = tmpを使用するよりも2倍遅かったです。一時的な割り当てをすべて排除するためにエスケープ解析を解除した後、一時的な配列を使用した配列分解は代入のシーケンスと同じ速さになりました。

Object.assignの改良

Object.assignにはこれまでC++で記述された高速なパスがありました。これにより、各Object.assign呼び出しでJavaScriptからC++への境界を越える必要がありました。組み込み性能を向上させる明らかな方法は、JavaScriptサイドに高速パスを実装することでした。選択肢は2つありました: ネイティブJS組み込みとして実装する(この場合、不要なオーバーヘッドが発生する)か、CodeStubAssembler技術を使用して実装する(より柔軟性がある)。後者の方法を選びました。新しいObject.assignの実装は、Speedometer2/React-Reduxのスコアを約15%改善し、Speedometer 2の総合スコアを1.5%改善します

TypedArray.prototype.sortの改良

TypedArray.prototype.sortには2つのパスがあります: ユーザーが比較関数を提供しない場合に使用される高速パスと、それ以外すべてのための低速パスです。これまで、低速パスはArray.prototype.sortの実装を再利用していましたが、これはTypedArrayをソートするのに必要以上の処理を行っていました。V8 v6.8では、低速パスがCodeStubAssemblerで実装されたものに置き換えられました(直接のCodeStubAssemblerではなく、その上に構築されたドメイン固有言語を使用)。

比較関数なしでTypedArrayをソートする際の性能は同じですが、比較関数を使用した場合は最大2.5倍の高速化が図られています。

WebAssembly

V8 v6.8では、Linux x64プラットフォーム上でトラップベースの境界チェックを使用し始めることができます。このメモリ管理の最適化により、WebAssemblyの実行速度が大幅に向上します。すでにChrome 68で使用されていますが、将来的にはさらに多くのプラットフォームが順次サポートされる予定です。

V8 API

git log branch-heads/6.7..branch-heads/6.8 include/v8.hを使用して、API変更の一覧を取得してください。

アクティブなV8チェックアウトをしている開発者は、git checkout -b 6.8 -t branch-heads/6.8を使用してV8 v6.8の新機能を試すことができます。あるいは、Chromeのベータチャンネルに登録して、間もなく自分で新機能を試すことができます。