首页  >  文章  >  web前端  >  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 都声称具有高性能。但是在你自己的代码中呢? 如果有一个工具可以在多个运行时运行基准测试并将结果导出到一份报告中,那就太酷了——这就是我创建 ESBench 的主要动机。

  • 有一些有用的功能我认为 JS 基准测试工具无法做到,例如计算渐近复杂度、验证返回值以及将结果绘制到交互式图表中.

使用 ESBench 进行基准测试

为了解决这些问题,我决定创建一个新工具,它包含我需要的所有功能并具有简单的 API。

经过大约一年的开发,ESBench 诞生了。

您可以在线尝试ESBench

写作套件

ESBench 选择声明式 API 和闭包,这是最流行的 JS 编写方式。

比较 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn