BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース V8 JavaScript Engine 9.0で、JavaScript to WebAssemblyのパフォーマンスを向上

V8 JavaScript Engine 9.0で、JavaScript to WebAssemblyのパフォーマンスを向上

原文(投稿日:2021/03/23)へのリンク

V8 JavaScriptエンジンの9.0リリースでは、ChromeおよびChromiumベースのブラウザが強化されている。JavaScriptからのWebAssembly呼び出しのパフォーマンスが改善され、正規表現マッチインデックスを追加され、そして、superプロパティへのアクセスが高速化された。

JavaScriptからWebAssemblyを呼び出す場合、JavaScriptからJavaScriptコードを呼び出す場合と比較して、パフォーマンスが低下する。V8リリースの発表で次のように説明されている。

V8は、WebAssembly関数とJavaScript関数のパラメーターに異なる表現を使います。このため、JavaScriptがエクスポートされたWebAssembly関数を呼び出すと、呼び出しはいわゆるJS-to-Wasmラッパーを経由します。ラッパーは、JavaScriptランドからWebAssemblyランドにパラメーターを適応させ、また、結果を反対方向に適応させる役割を担います。

ラッパー呼び出しを呼び出し側でインライン化することで、JavaScriptからWebAssemblyへのラッパーのパフォーマンスオーバーヘッドを最小限に抑えることができるようになった。この実験的な--turbo-inline-js-wasm-callsフラグを使用すると、パフォーマンスベンチマークは、典型的な呼び出しをインラインラッパーなしで約3分の1の時間内に完了することができる。他の詳細は、Faster js-to-wasm呼び出し設計ドキュメントで確認できる。

ステージ3のTC39 RegExpマッチインデックスの提案では、正規表現マッチオブジェクトに関する詳細情報を紹介している。その提案では、キャプチャされた各グループの開始位置と終了位置が記録される。例を次に示す。

const matchObject = /(i+)(q+)/.exec('iiinfoqqqq');
assert.equal(
  matchObject[1], 'iii');
assert.equal(
  matchObject[2], 'qqqq');

 

マッチインデックスは、matchObject.indicesを介して、マッチした開始インデックスと終了インデックスを提供する。

assert.deepEqual(
  matchObject.indices[1], [0, 3]);
assert.deepEqual(
  matchObject.indices[2], [6, 10]);

 

V8がマッチインデックスをサポートしているため、この機能はChrome 90以降で利用できるようになる。この機能はFirefoxSafariでも間もなく提供される予定で、現在はナイトリーリリースでサポートされている。

superプロパティへのアクセスは、V8のインラインキャッシュシステムとTurboFanによる最適化されたコード生成によって最適化される。superプロパティへのアクセスは、以前は通常のプロパティアクセスよりも約20倍遅く、現在はパフォーマンスが同等である。超高速のsuperプロパティアクセスによって、このパフォーマンス上の利点がV8内でどのように達成されたかについて、より多くの情報が提供されている。

V8は6週間ごとに更新され、Chromeブラウザ、Node.js、Electron、DenoなどのJavaScriptが強化されている。V8はオープンソースソフトウェアであり、外部の依存関係により、コードベースのサブセットに適用可能なライセンスがいくつかある。コントリビューションはV8 Gitプロジェクトを通して歓迎であり、その際、V8のコントリビューションガイドラインGoogleのオープンソース行動ガイドラインに従う必要がある。

この記事に星をつける

おすすめ度
スタイル

BT