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

V8リリース v7.1

· 約4分
Stephan Herhut ([@herhut](https://twitter.com/herhut)), クローン作成者のクローン

6週間ごとに、私たちはV8の新しいブランチをリリースプロセスの一環として作成します。各バージョンは、Chrome Betaのマイルストーン直前にV8のGitマスターからブランチされます。本日は、最新のブランチV8バージョン7.1を発表できることを嬉しく思います。これは数週間でChrome 71 Stableと連携してリリースされるまでベータ版です。V8 v7.1は、開発者向けの便利な機能で満たされています。この投稿では、リリースに向けたハイライトの一部をプレビューとして紹介します。

メモリ

v6.9/v7.0でのバイナリにビルトインを直接埋め込む作業に続いて、インタープリター用のバイトコードハンドラーもバイナリに埋め込まれるようになりました。これにより、Isolateごとに平均約200 KBが節約されます。

パフォーマンス

TurboFanのエスケープ分析が改良され、最適化ユニットにローカルなオブジェクトだけでなく、高階関数のローカル関数コンテキストも処理できるようになりました。以下の例を考えてみましょう:

function mapAdd(a, x) {
return a.map(y => y + x);
}

注目すべきは、xがローカルクロージャーy => y + xの自由変数である点です。V8 v7.1では、xのコンテキスト割り当てを完全に省略することが可能となり、一部の場合で最大**40%**の改善が得られます。

新しいエスケープ分析によるパフォーマンス改善(値が小さいほど良い)

エスケープ分析は、ローカル配列への変数インデックスアクセスの一部についても削除可能となりました。以下はその例です:

function sum(...args) {
let total = 0;
for (let i = 0; i < args.length; ++i)
total += args[i];
return total;
}

function sum2(x, y) {
return sum(x, y);
}

注意すべき点は、argssum2にローカルであることです(sumsum2にインライン展開されると仮定)。V8 v7.1では、TurboFanがargsの割り当てを完全に除去し、インデックスアクセスargs[i]を三項演算子i === 0 ? x : yで置き換えることが可能になりました。これにより、JetStream/EarleyBoyerベンチマークで約2%の改善が得られます。将来的に、要素が2つ以上の配列にもこの最適化を拡張する可能性があります。

Wasmモジュールの構造化複製

ついに、postMessageがWasmモジュールに対応しましたWebAssembly.Moduleオブジェクトは、ウェブワーカーにpostMessageで送信できるようになりました。ただし、これはウェブワーカー(同じプロセス内の別スレッド)に限定されており、クロスプロセスシナリオ(クロスオリジンpostMessageや共有ウェブワーカーなど)には拡張されていません。

JavaScript言語機能

Intl.RelativeTimeFormat APIは、ローカライズされた相対時刻(例: 「昨日」、「42秒前」、「3か月後」など)のフォーマットを可能にしながら性能を犠牲にしません。以下はその例です:

// 英語の言語で、出力で常に数値を使用する必要がない
// 相対時間フォーマッターを作成します。
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });

rtf.format(-1, 'day');
// → 'yesterday'

rtf.format(0, 'day');
// → 'today'

rtf.format(1, 'day');
// → 'tomorrow'

rtf.format(-1, 'week');
// → 'last week'

rtf.format(0, 'week');
// → 'this week'

rtf.format(1, 'week');
// → 'next week'

Intl.RelativeTimeFormatの解説はこちらをご覧ください

V8 v7.1はglobalThis提案もサポートし、厳密関数やモジュールでもプラットフォームに依存せずグローバルオブジェクトにアクセスできる普遍的なメカニズムを実現します。

V8 API

API変更のリストを取得するには、git log branch-heads/7.0..branch-heads/7.1 include/v8.hを使用してください。

アクティブなV8チェックアウトを持つ開発者は、git checkout -b 7.1 -t branch-heads/7.1を使用してV8 v7.1の新機能を試すことができます。あるいはChromeのBetaチャネルに登録し、すぐに新機能を試してみることもできます。