V8 リリース v6.2
6週間ごとに、新しいブランチを作成するのが私たちのリリースプロセスの一環です。各バージョンは、Chrome Beta マイルストーンの直前に V8 の Git マスターからブランチ化されます。本日、最新ブランチである V8 バージョン 6.2 を発表できることを嬉しく思います。このバージョンは数週間後に Chrome 62 ステーブルと共にリリースされるまでベータ版です。V8 v6.2 は、開発者向けのさまざまな興味深い機能を備えています。この投稿では、リリースを見越していくつかのハイライトを紹介します。
パフォーマンス向上
Object#toString
のパフォーマンスは以前から潜在的なボトルネックとして認識されており、これは lodash や underscore.js といった人気のあるライブラリや、AngularJS のようなフレームワークで頻繁に使用されているためです。_.isPlainObject
、_.isDate
、angular.isArrayBuffer
、angular.isRegExp
といった各種ヘルパー関数が、アプリケーションやライブラリコード全体でよく使用され、実行時の型チェックを行います。
ES2015 の登場により、Symbol.toStringTag
シンボルを介して Object#toString
がモンキーパッチ可能になり、これによって Object#toString
はより重く、速度を上げるのが困難になりました。このリリースでは、SpiderMonkey JavaScript エンジン で最初に実装された最適化を V8 に移植し、Object#toString
のスループットを 6.5倍 向上させました。
この最適化は Speedometer ブラウザベンチマーク、特に AngularJS サブテストにも影響を与え、3% の改善を測定しました。詳細なブログ投稿 をぜひお読みください。
また、ES2015 プロキシ のパフォーマンスが大幅に向上し、someProxy(params)
または new SomeOtherProxy(params)
を介したプロキシオブジェクトの呼び出し速度が最大 5倍 速くなりました。
同様に、someProxy.property
を介してプロキシオブジェクト上のプロパティにアクセスするパフォーマンスがほぼ 6.5倍 改善されました。
これらは進行中のインターンシップの一環です。より詳細なブログ投稿および最終結果を楽しみにお待ちください。
また、Peter Wong 氏の貢献により String#includes
組み込みのパフォーマンスが前回のリリース以降 3倍以上 向上したことをお知らせします。
内部ハッシュテーブルのハッシュコード検索が大幅に高速化され、Map
、Set
、WeakMap
、そして WeakSet
の性能が向上しました。詳細な最適化の説明は今後のブログ投稿をご期待ください。
ガーベジコレクタは、ヒープの若いジェネレーションを収集するための Parallel Scavenger を使用するようになりました。
強化された低メモリモード
ここ数回のリリースにわたり、V8 の低メモリモードが強化されてきました(例えば、初期半空間サイズを 512 KB に設定 するなど)。低メモリデバイスは、アウト・オブ・メモリの状況に陥ることが少なくなりました。ただし、この低メモリ動作はランタイムパフォーマンスに悪影響を及ぼす可能性があります。
さらに多くの正規表現機能
dotAll
モード のサポートが正規表現でデフォルトで有効になり、 s
フラグを使用してこの機能を利用できます。dotAll
モードでは、正規表現内の .
アトムが行の終端記号を含む任意の文字と一致します。
/foo.bar/su.test('foo\nbar'); // true
後方参照アサーションという新しい正規表現の機能がデフォルトで利用可能になりました。この名称がその意味をよく表しています。後方参照アサーションは、後方参照グループ内にあるパターンが先行している場合にのみパターンがマッチするように制限する方法を提供します。マッチングの場合と非マッチングの場合の両方があります:
/(?<=\$)\d+/.exec('$1 is worth about ¥123'); // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123'); // ['123']
これらの機能の詳細については、今後の正規表現機能というタイトルのブログ記事をご覧ください。
テンプレートリテラルの改訂
テンプレートリテラルでのエスケープシーケンスに対する制限が関連する提案に基づいて緩和されました。これにより、LaTeXプロセッサのようなテンプレートタグの新しい使用例が可能になります。
const latex = (strings) => {
// …
};
const document = latex`
\newcommand{\fun}{\textbf{楽しい!}}
\newcommand{\unicode}{\textbf{ユニコード!}}
\newcommand{\xerxes}{\textbf{王!}}
hの上のブレーベはここに\u{h}あります // 不正なトークン!
`;
最大文字列長の増加
64ビットプラットフォームでの最大文字列長が2**28 - 16
文字から2**30 - 25
文字に増加しました。
Full-codegenが廃止されました
V8 v6.2では、旧パイプラインの主要な部分が完全に廃止されました。このリリースでは30K行以上のコードが削除され、コードの複雑さが大幅に削減されました。
V8 API
APIの変更概要をご覧ください。このドキュメントは各主要リリース後数週間で定期的に更新されます。
アクティブなV8チェックアウトを持つ開発者はgit checkout -b 6.2 -t branch-heads/6.2
を使ってV8 v6.2の新機能を試せます。または、Chromeのベータチャンネルを購読することで、新機能をすぐに試すことができます。