benchmark.js は 2024 年 4 月に終了します。新世代のツールが登場する時期が来ました!
ESBench は、2024 年にリリースされた新しい JavaScript ベンチマーク ツールです。最新の JS プロジェクトにシンプルでスケーラブルなベンチマーク サポートを提供するように設計されています。
GitHub リポジトリ
当初、JavaScript はソースから直接実行されていましたが、アプリケーションがより複雑になるにつれて、これはますます当てはまらなくなりました。最新のアプリケーションはビルドする必要があることが多く、ビルド プロセスを統合できるベンチマーク ツールが必要です。また、パフォーマンスに対するビルドの影響を考慮する必要があります。
JavaScript には「公式ランタイム」がありません。ブラウザ、Node、Deno、そして最近では Bun はすべて、高いパフォーマンスを主張しています。しかし、自分のコードではどうなるでしょうか? 複数のランタイムでベンチマークを実行し、その結果を 1 つのレポートにエクスポートできるツールがあれば素晴らしいでしょう —— それが ESBench を作成した主な動機でした。
JS ベンチマーク ツールでは実行できない便利な機能がいくつかあります (漸近複雑度の計算、戻り値の検証、結果の対話型グラフへのプロットなど) .
これらの問題を解決するために、必要な機能をすべて備え、シンプルな API を備えた新しいツールを作成することにしました。
約 1 年の開発を経て、ESBench が誕生しました。
ESBench をオンラインで試すことができます
ESBench は、JS の最も一般的な記述方法である宣言型 API とクロージャーを選択します。
Set.has と Array.includes を比較します:
// benchmark/array-vs-set.js export default scene => { const length = 1000; const array = Array.from({ length }, (_, i) => i); const set = new Set(array); const value = array[Math.floor(array.length / 2)]; scene.bench("Set", () => set.has(value)); scene.bench("Array", () => array.includes(value)); };
pnpm exec esbench を実行してスイートを実行すると、結果は次のようになります:
Suite: benchmark/array-vs-set.js | No. | Name | time | time.SD | | --: | ----: | --------: | ------: | | 0 | Set | 3.64 ns | 0.00 ns | | 1 | Array | 326.36 ns | 0.17 ns |
パラメータ化とベースラインは頻繁に必要となる要件ですが、ESBench はシンプルなオプションでそれらをサポートします。
export default { baseline: { type: "type", value: Set }, params: { length: [10, 10_000], type: [Set, Array], }, setup(scene) { const { length, type } = scene.params; // Prepare const array = Array.from({ length }, (_, i) => i); const set = new Set(array); const value = array[Math.floor(array.length / 2)]; // Support conditions if (type === Set) { // Define benchmark cases scene.bench("create", () => new Set(array)); scene.bench("has", () => set.has(value)); } else { scene.bench("create", () => [...array]); scene.bench("has", () => array.includes(value)); } }, };
テキストレポート:
複数のランタイムで実行される上記の問題に戻ります:
// esbench.config.js import { defineConfig, ProcessExecutor, ViteBuilder, WebRemoteExecutor } from "esbench/host"; export default defineConfig({ toolchains: [{ // Build your benchmark code with Vite, require vite installed. builders: [new ViteBuilder()], executors: [ // Run suite on Node. new ProcessExecutor("node"), // Run suite on Bun. new ProcessExecutor("bun"), // Open the default browser to run benchmark, // in my computer it's Firefox. { name: "Firefox", use: new WebRemoteExecutor({ open: {} }), }, ], }], });
ランタイムをベースラインとして設定することもできます:
import { defineSuite } from "esbench"; export default defineSuite({ baseline: { type: "Executor", value: "node" }, setup(scene) { const length = 1000; const array = Array.from({ length }, (_, i) => i); const set = new Set(array); const value = array[Math.floor(array.length / 2)]; scene.bench("Set", () => set.has(value)); scene.bench("Array", () => array.includes(value)); }, });
結果:
| No. | Name | Executor | time | time.SD | time.ratio | | --: | ----: | -------: | --------: | ------: | ---------: | | 0 | Set | node | 3.69 ns | 0.03 ns | baseline | | 1 | Set | bun | 0.00 ns | 0.00 ns | -100.00% | | 2 | Set | Firefox | 0.00 ns | 0.00 ns | -100.00% | | | | | | | | | 3 | Array | node | 325.02 ns | 1.00 ns | baseline | | 4 | Array | bun | 324.87 ns | 0.08 ns | -0.04% | | 5 | Array | Firefox | 516.70 ns | 0.75 ns | +58.98% | Warnings: [No.1] Set: The function duration is indistinguishable from the empty function duration. [No.2] Set: The function duration is indistinguishable from the empty function duration.
ESBench は基本的な使用法以上のことができます:
JavaScript でベンチマークを書くのに飽きたら、ESBench が待ち望んでいたライブラリです。
以上がESBench: 最新のベンチマーク ツールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。