ホームページ  >  記事  >  ウェブフロントエンド  >  ESBench: 最新のベンチマーク ツール

ESBench: 最新のベンチマーク ツール

Barbara Streisand
Barbara Streisandオリジナル
2024-09-25 06:28:06254ブラウズ

benchmark.js は 2024 年 4 月に終了します。新世代のツールが登場する時期が来ました!

ESBench は、2024 年にリリースされた新しい JavaScript ベンチマーク ツールです。最新の JS プロジェクトにシンプルでスケーラブルなベンチマーク サポートを提供するように設計されています。

GitHub リポジトリ

問題

  • 当初、JavaScript はソースから直接実行されていましたが、アプリケーションがより複雑になるにつれて、これはますます当てはまらなくなりました。最新のアプリケーションはビルドする必要があることが多く、ビルド プロセスを統合できるベンチマーク ツールが必要です。また、パフォーマンスに対するビルドの影響を考慮する必要があります。

  • JavaScript には「公式ランタイム」がありません。ブラウザ、Node、Deno、そして最近では Bun はすべて、高いパフォーマンスを主張しています。しかし、自分のコードではどうなるでしょうか? 複数のランタイムでベンチマークを実行し、その結果を 1 つのレポートにエクスポートできるツールがあれば素晴らしいでしょう —— それが ESBench を作成した主な動機でした。

  • JS ベンチマーク ツールでは実行できない便利な機能がいくつかあります (漸近複雑度の計算、戻り値の検証、結果の対話型グラフへのプロットなど) .

ESBench によるベンチマーク

これらの問題を解決するために、必要な機能をすべて備え、シンプルな 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: A modern benchmarking tool

クロスランタイム

複数のランタイムで実行される上記の問題に戻ります:

// 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 は基本的な使用法以上のことができます:

  • 関数の Big-O 時間計算量を計算します
  • zlib 関数の圧縮/解凍時間と出力サイズを測定します
  • ベンチマークの前に戻り値を検証する
  • GitHub Action の 3 つのイメージのベンチマーク

結論

JavaScript でベンチマークを書くのに飽きたら、ESBench が待ち望んでいたライブラリです。

以上がESBench: 最新のベンチマーク ツールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。