本日は、新しいWebKit JavaScript benchmarkテストスイートJetStreamをご紹介します。 Jetstreamは、レイテンシとスループットのベンチマークをほぼ等しい重み付けで組み合わせ、従来のJavaScriptプログラミングスタイルのメトリックと、私たちの想像を JetStreamのスコアは、ユーザーがゲームのような高度なwebアプリケーションで見るパフォーマンスの良い指標です。
JavaScriptエンジンのパフォーマンスを最適化することは、WebKitプロジェクトにとって最優先事項です。 昨年導入したいくつかの改善の例には、同時コンパイル、世代GC、FTL JITなどがあります。 そのような改善を設計するには、焦点を当てる必要があります:私たちは、より小さな利点を持つ複雑な最適化を構築し、維持するよりも、影響の大き したがって、WebKitユーザーが遭遇する可能性のあるワークロードの種類を示すベンチマークでパフォーマンス作業を動機付けます。 ベンチマーク駆動開発のこの哲学は、長い間WebKitの一部となっています。
JavaScriptベンチマークの以前の状態
WebKit JavaScriptエンジンを強化したところ、改善したいシナリオを完全に表すベンチマークスイートは単一ではないことがわかりました。 JSBenchが人気のあるwebサイトでJavaScriptコードのパフォーマンスを測定するのが好きですが、WebKitはすでにこのベンチマークで非常にうまく機能しています。 私たちは、SunSpiderが一般的に使用される言語構成のカバレッジと、その実行時間がweb上のコードの実行時間を表しているという事実のために好きですが、ピークスループットを測定するには不足しています。 エンジンのピークスループットを決定するのには便利ですが、一般的なwebワークロードで見られる可能性が最も高いパフォーマンスには十分に敏感ではありません。 また、asmのような新しいJavaScript技術を軽視しています。js;Octaneの15のベンチマークのうちの1つだけがasmでした。このテストでは浮動小数点パフォーマンスは無視されます。
良いasmを見つける。jsのベンチマークは難しいです。 Emscriptenはmindshareを獲得しているにもかかわらず、そのテストは長時間実行されており、最近まで、webハーネスを欠いていました。 そこで私たちは独自のasmを構築しました。LLVMテストスイートのテストを使用してjsベンチマークを実行します。 これらのCおよびC++テストは、llvm開発者がclang/LLVMコンパイラスタックのパフォーマンス向上を追跡するために使用されます。 Emscripten自体はLlvmを使用してJavaScriptコードを生成します。 これにより、LLVMテストスイートは、JavaScriptエンジンがネイティブコードをどのように処理するかをテストするのに特に適しています。 私たちの新しいテストのもう一つの利点は、Emscriptenテストスイートよりも実行がはるかに速いことです。
優れたJavaScriptベンチマークを持つことで、WebKitの野心的な改善を自信を持って追求することができます。 たとえば、SunSpiderはasmの間に並行コンパイル作業をガイドしました。jsテストとOctaneのスループットテストは、FTL JITに関する作業を動機づけました。 しかし、これらの異なるベンチマークスイートの寄せ集めに基づいてテストすることを許可することは実用的ではありません。 変更がパフォーマンスに望ましい影響を与えたかどうかを伝えることができる統一されたテストスイートがない場合、貢献者に何をテストすべきか 最終的に1つのスコアを報告できる1つのテストスイートが必要で、この1つのスコアがWebKitの将来の方向性を代表するものになりたいと考えています。
新しいJetStream Benchmark Suiteの設計
異なるWebKitコンポーネントは、パフォーマンスの測定に異なるアプローチを必要とします。 たとえば、DOMパフォーマンスのために、Speedometerベンチマークを導入しました。 いくつかのケースでは、明白なアプローチはかなりうまく動作します: 例えば、多くのレイアウトとレンダリングの最適化は、代表的なwebページ上のページの読み込み時間を測定することによって駆動することができます。 しかし、プログラミング言語の実装のパフォーマンスを測定するには、より繊細さが必要です。 私たちは、コアエンジンの改善に対するベンチマークの感度を高めたいが、それほどではないので、それらのエンジンの改善が実際のwebサイトでどのよ 私たちは、システムノイズが測定値を捨てる機会を最小限に抑えたいと考えていますが、ワークロードが本質的にノイズになりやすいときはいつでも、こ 私たちのベンチマークは、WebKitユーザーが気にする可能性の高いワークロードの忠実度の高い近似を表すことを望んでいます。
JetStreamは、さまざまな高度なワークロードとプログラミング技術をカバーするさまざまなJavaScriptベンチマークを組み合わせ、幾何平均を使用してそれらのバランスをとる単一のスコアを報告します。 各検定は3回実行され、スコアは95%の信頼区間で報告されます。 各ベンチマークは個別のワークロードを測定し、すべてのベンチマークを高速化するのに十分な単一の最適化手法はありません。 いくつかのベンチマークはトレードオフを示しており、あるベンチマークに対して積極的または特殊な最適化を行うと、別のベンチマークが遅くなる可能性があります。 トレードオフを実証することは、私たちの仕事にとって重要です。 新しいJITコンパイラについての以前の記事で説明したように、WebKitは異なる実行層を使用してワークロードに動的に適応しようとします。 しかし、これは決して完璧ではありません。 たとえば、新しいFTL JITコンパイラは、ピークスループットテストで素晴らしいスピードアップを提供しますが、一部のランプアップテストではわずかな回帰 高度な言語ランタイムのための新しい最適化は、多くの場合、このようなトレードオフに遭遇し、JetStreamとの目標は、私たちが作っているトレードオフについて私たちに知らせるベンチマークを持つことです。
JetStreamには、SunSpider1.0.2およびOctane2JavaScriptベンチマークスイートのベンチマークが含まれています。 また、Emscripten1.13を使用してJavaScriptにコンパイルされたLLVMコンパイラオープンソースプロジェクトのベンチマークも含まれています。 また、Apache HarmonyオープンソースプロジェクトのHashMapに基づくベンチマークも含まれており、javascriptに手作業で翻訳されています。 JetStreamに含まれるベンチマークの詳細については、Jetstream In Depthページを参照してください。
私たちはこの新しいベンチマークを導入することに興奮しています。 それを実行するには、単に訪問browserbench.org/JetStream.Tools/Testsコンポーネントの下にあるwebkitのバグ管理システムを使用して、ベンチマークに対してバグを提出することができます。