benchmark.js 将于 2024 年 4 月结束,是时候新一代工具出现了!
ESBench 是 2024 年发布的全新 JavaScript 基准测试工具。它旨在为现代 JS 项目提供简单、可扩展的基准测试支持。
GitHub 存储库
一开始,JavaScript 是直接从源代码运行的,但随着应用程序变得越来越复杂,这种情况变得越来越少。现代应用程序经常需要构建,这需要基准测试工具能够集成构建过程,并且需要考虑构建对性能的影响。
JavaScript 没有“官方运行时”,浏览器、Node、Deno 以及最近的 Bun 都声称具有高性能。但是在你自己的代码中呢? 如果有一个工具可以在多个运行时运行基准测试并将结果导出到一份报告中,那就太酷了——这就是我创建 ESBench 的主要动机。
有一些有用的功能我认为 JS 基准测试工具无法做到,例如计算渐近复杂度、验证返回值以及将结果绘制到交互式图表中.
为了解决这些问题,我决定创建一个新工具,它包含我需要的所有功能并具有简单的 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.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中文网其他相关文章!