Web Tooling Benchmarkを発表
JavaScriptのパフォーマンスは常にV8チームにとって重要な課題であり、この投稿では最近使用している新しいJavaScriptWeb Tooling Benchmarkについて説明し、V8のパフォーマンスボトルネックを特定および修正する方法を共有します。既にご存じの方もいるかもしれませんが、V8はNode.jsに対する強いコミットメントを持っており、このベンチマークは特にNode.jsに基づいて構築された一般的な開発者ツールを使ったパフォーマンステストを実施することでそのコミットメントを拡張しています。Web Tooling Benchmarkに含まれるツールは、現代的なウェブサイトやクラウドベースのアプリケーションを構築するために、開発者やデザイナーが現在使用しているものと同じです。実際のパフォーマンスに焦点を合わせる現在進行中の取り組みを継続するために、開発者が毎日実際に使用するコードを基にベンチマークを作成しました。
Web Tooling Benchmarkスイートは、Node.jsの重要な開発者ツールユースケースをカバーするように初めから設計されました。V8チームは基本的なJavaScriptパフォーマンスに焦点を当てているため、このベンチマークはJavaScriptのワークロードに集中し、Node.js特有のI/Oや外部のインタラクションの測定を除外しています。この構成により、ベンチマークをNode.js、すべてのブラウザ、および主要なJavaScriptエンジンシェル(ch
(ChakraCore)、d8
(V8)、jsc
(JavaScriptCore)、そしてjsshell
(SpiderMonkey))で実行することが可能です。ベンチマークはNode.jsに限定されていないにもかかわらず、Node.jsベンチマーク作業部会がこのツールベンチマークをNodeパフォーマンスの標準として使用することを検討していることに魅了されています(nodejs/benchmarking#138).
ツールベンチマークの個々のテストでは、開発者が通常JavaScriptベースのアプリケーションを構築する際に使用するさまざまなツールをカバーしています。例えば、以下のツールが含まれています:
es2015
プリセットを使用するBabelトランスパイラー。- Babelで使用されるパーサーBabylon、(lodashやPreactバンドルなどの人気の入力を対象)。
- webpackで使用されるacornパーサー。
- TodoMVCプロジェクトの例であるtypescript-angularに対して実行されるTypeScriptコンパイラ。
含まれるすべてのテストの詳細については、詳細な分析をご覧ください。
Speedometerなどの以前のベンチマークの経験に基づき、フレームワークの新しいバージョンが利用可能になると、テストが迅速に時代遅れになることがあるため、ベンチマーク内の各ツールをリリースされる最新バージョンに簡単に更新できるようにしました。npmインフラストラクチャに基づいてベンチマークスイートを構築することで、最新のJavaScript開発ツールの状態を常にテストできるように簡単に更新できます。テストケースを更新する際は、package.json
マニフェスト内のバージョンを変更するだけです。
新しいベンチマークで収集したV8のパフォーマンスに関する関連情報を含む追跡バグとスプレッドシートを作成しました。我々の調査はすでにいくつかの興味深い結果を得ています。例えば、instanceof
でV8がしばしば遅いパスに到達することを発見しました(v8:6971)、これにより3~4倍のスローダウンが発生しました。また、Object.create(null)
を介して作成されたobj
にobj[name] = val
の形式でプロパティを割り当てる特定のケースでパフォーマンスボトルネックを発見し修正しました。これらの場合、obj
がnull
プロトタイプを持つという事実を利用できるにもかかわらず、V8は高速パスから外れてしまうことがありました(v8:6985)。このベンチマークの助けを借りたこれらやその他の発見によって、Node.jsだけでなくChromeでもV8が改善されました。
私たちはV8を高速化することだけでなく、ベンチマークのツールやライブラリにおけるパフォーマンスのバグを発見するたびに修正し、上流に改善を反映しました。例えば、Babelにおいて以下のようなコードパターンに複数のパフォーマンスのバグがあることを発見しました。
value = items[items.length - 1];
このコードは事前にitems
が空かどうかをチェックしないため、プロパティ"-1"
へのアクセスを引き起こします。このコードパターンは、V8が"-1"
の検索のために遅いパスを通る原因となりますが、少し修正した同等のJavaScriptコードのバージョンは遥かに高速です。私たちはBabelのこれらの問題を修正する手助けをしました(babel/babel#6582、babel/babel#6581、および babel/babel#6580)。また、Babelが文字列の長さを超えてアクセスするバグを発見し修正しました(babel/babel#6589)、これによってV8内で別の遅いパスが発生していました。加えて、V8において配列や文字列の範囲外の読み込みを最適化しました。この重要な使用ケースの性能を向上させるために、V8の上で実行される場合だけでなく、ChakraCoreのような他のJavaScriptエンジン上で実行される場合についてもコミュニティとの協力を続けることを楽しみにしています。
現実世界の性能に重点を置き、特に人気のあるNode.jsのワークロードを改善することに注力していることは、最近数回のリリースにわたるベンチマークスコアの一定の改善によって示されています:
Ignition+TurboFanアーキテクチャへの切り替え以前の最後のV8リリースであるV8 v5.8以降、ツールベンチマークにおけるV8のスコアは約**60%**改善されました。
過去数年間、V8チームは1つのJavaScriptベンチマークが JavaScriptエンジン全体の性能の単一の指標として使用されるべきではないことを認識してきました。しかし、私たちは新しいWeb Tooling Benchmarkが注目すべきJavaScript性能の領域を強調していると信じています。その名前と初期の動機にかかわらず、Web Tooling Benchmarkスイートはツールワークロードを代表するだけでなく、Speedometerのようなフロントエンド中心のベンチマークで十分に検証されないより高度なJavaScriptアプリケーションの広範囲を代表していることがわかりました。これはSpeedometerの代替ではなく、補完的なテストセットです。
何よりも嬉しいニュースは、Web Tooling Benchmarkが実際のワークロードを中心に構成されているため、ベンチマークスコアの最近の改善が直接的にビルド待ち時間の短縮を通じて開発者生産性の向上につながると予想されることです。これらの改善の多くはすでにNode.jsで利用可能です。執筆時点では、Node 8 LTSはV8 v6.1を使用し、Node 9はV8 v6.2を使用しています。
ベンチマークの最新バージョンはhttps://v8.github.io/web-tooling-benchmark/にホストされています。