V8 リリース v6.4
毎回6週間ごとに、私たちは リリースプロセス の一環として V8 の新しいブランチを作成します。各バージョンは Chrome Beta マイルストーン直前に V8 の Git マスターからブランチ化されます。本日、新しいブランチ V8 バージョン 6.4 を発表します。このバージョンは数週間後に Chrome 64 Stable と連携してリリースされるまでベータ版として利用可能です。V8 v6.4 には開発者向けの多くの機能が満載です。この投稿では、リリースに向けて注目すべき主な点をプレビューします。
スピード
V8 v6.4 は instanceof 演算子の性能を 3.6 倍向上 させます。この結果として、uglify-js は V8 の Web Tooling Benchmark に基づくと、15~20% 高速化されています。
このリリースでは Function.prototype.bind
の性能問題にも取り組みました。たとえば、TurboFan はすべての単形的(monomorphic)bind
呼び出しを 一貫してインライン化 します。さらに、TurboFan では バウンドコールバックパターン もサポートしており、次のようにする代わりに:
doSomething(callback, someObj);
次のように使うことができます:
doSomething(callback.bind(someObj));
これにより、コードの可読性が向上し、同じ性能を得ることができます。
Peter Wong の最新の貢献により、WeakMap
と WeakSet
が CodeStubAssembler を使用して実装され、性能が最大で 5 倍向上しました。
V8 の 継続的な取り組み の一環として配列ビルトインの性能を向上させるために、Array.prototype.slice
の性能が CodeStubAssembler を使って再実装され、約 4 倍向上しました。また、Array.prototype.map
および Array.prototype.filter
の呼び出しは多くのケースでインライン化され、手書きのバージョンと競争力のある性能プロファイルを持つようになりました。
配列、型付き配列、文字列の範囲外読み込みが これまでの ~10 倍の性能低下を引き起こすことがなくなる ように働きかけ、不意に このコーディングパターン が使われる場合に対応しました。
メモリ
V8 の組み込みコードオブジェクトとバイトコードハンドラは、スナップショットから遅延的にデシリアライズされるようになり、各 Isolate によって消費されるメモリを大幅に削減する可能性があります。Chrome のベンチマークでは、一般的なサイトを閲覧する場合にタブごとに数百 KB の節約が確認されています。
このテーマに関する専用のブログ投稿を来年の初めに注目してください。
ECMAScript 言語機能
この V8 リリースには、2 つの新しいエキサイティングな正規表現機能のサポートが含まれています。
/u
フラグ付き正規表現では、Unicode プロパティエスケープ がデフォルトで有効になりました。
const regexGreekSymbol = /\p{Script_Extensions=Greek}/u;
regexGreekSymbol.test('π');
// → true
名前付きキャプチャグループ のサポートもデフォルトで有効になりました。
const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-12-15');
// result.groups.year === '2017'
// result.groups.month === '12'
// result.groups.day === '15'
これらの機能に関する詳細は、今後の正規表現機能 というタイトルのブログ投稿をご覧ください。
Groupon のおかげで、V8 は import.meta
を実装し、埋め込みプログラムが現在のモジュールに関するホスト固有のメタデータを公開できるようになりました。たとえば、Chrome 64 は import.meta.url
を通じてモジュール URL を公開し、将来的には import.meta
にさらに多くのプロパティを追加する予定です。
国際化フォーマッタによって生成された文字列のローカル対応型のフォーマットを支援するために、開発者は Intl.NumberFormat.prototype.formatToParts()
を使用して、数値をトークンとそのタイプのリストへフォーマットできます。Igalia の V8 への実装に感謝します!
V8 API
APIの変更リストを取得するには、git log branch-heads/6.3..branch-heads/6.4 include/v8.h
をご使用ください。
アクティブなV8チェックアウトを持つ開発者は、git checkout -b 6.4 -t branch-heads/6.4
を使用して、V8 v6.4の新機能を試すことができます。または、Chromeのベータチャネルに登録して、近日中に新機能を試すこともできます。