上手JavaScript基准测试

简介: 上手JavaScript基准测试

写作背景:


     我们在开发过程中经常会遇到这样一个问题,同样的功能有很多中实现的方案,但是选择那种方案,那种方案最优,耗时最短呢?除了从书上写的,别人嘴里说的,我们最好是用数据来说话,眼见为实~


基准测试:


     基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。 —— 《百度百科》


使用Benchmark.js


1. 安装所需要的依赖:

{
    "benchmark": "^2.1.4",
    "chalk": "^4.1.0",
    "console-table-printer": "^2.10.0",
    "microtime": "^3.0.0",
    "ora": "^5.1.0"
}
复制代码


2. 编写benchmark主结构:

  1. 添加测试用例
  2. 设置监听
const Benchmark = require("benchmark");
const suite = new Benchmark.Suite();
const ora = require("ora");
const chalk = require("chalk");
const { getRows, p, addRow } = require("./utils");
const { description } = Benchmark.platform;
const spinner = ora();
console.log(chalk.green(description));
spinner.start(chalk.grey("Testing ..."));
const cases = function (cases) {
  // TODO 添加case
  // TODO 设置监听
  return suite;
};
module.exports = {
  cases,
};
复制代码

注意:后续可以直接编写测试用例,不再关注主结构编写


3. 使用benchmark的add函数添加测试用例:

cases.forEach((c) => {
    const key = Object.keys(c)[0];
    suite.add(key, c[key]);
});
复制代码


4. 设置监听来输出测试结果:

将每个测试用例的测试情况汇总后按表格形式展示反馈

suite
    .on("cycle", function (event) {
      spinner.succeed(chalk.green(String(event.target)));
      spinner.start(chalk.grey("Testing next case ..."));
    })
    .on("complete", function () {
      spinner.succeed(chalk.green("Test completed"));
      getRows(this.filter("successful")).forEach((row) => {
        addRow(row, row.case === this.filter("fastest").map("name")[0]);
      });
      p.printTable();
    });
复制代码


5. 终端输出表格:

依赖console-table-printer库来实现终端表格的输出hzs列用于排序所以隐藏掉了,hz列不清楚为啥转为Number后也没能成功排序

const p = new Table({
  columns: [
    { name: "case", title: "测试用例" },
    { name: "hz", title: "执行次数/秒" },
    { name: "rme", title: "相对误差" },
    { name: "sampled", title: "总执行次数" },
    { name: "conclusion", title: "结论" },
  ],
  sort: (r1, r2) => Number(r1.hzs) - Number(r2.hzs),
  disabledColumns: ["hzs"],
});
复制代码


6. 表格行数据整合:

  1. 第一列:测试用例名称
  2. 第二列:每秒执行用例次数,越高越好
  3. 第三列:相对误差值
  4. 第四列:用例被执行的实际次数
  5. 第五列:结论,被标记fastest的为最优用例
getRows: function (events) {
    const result = [];
    Object.keys(events).forEach((key) => {
      if (/^\d{0,}$/g.test(key)) {
        const {
          name,
          hz,
          stats: { sample, rme },
        } = events[key];
        const size = sample.length;
        result.push({
          case: name,
          hz: Benchmark.formatNumber(hz.toFixed(hz < 100 ? 2 : 0)),
          hzs: hz,
          rme: `\xb1${rme.toFixed(2)}%`,
          sampled: `${size} run${size == 1 ? "" : "s"} sampled`,
        });
      }
    });
    return result;
  },
复制代码


7. 测试用例编写:

将多分需要测试的案例代码分别装入数组后通过run函数来启动基准测试

require("../src")
  .cases([
    {
      "RegExp#test": function () {
        /o/.test("Hello World!");
      },
    },
    {
      "String#indexOf": function () {
        "Hello World!".indexOf("o") > -1;
      },
    },
    {
      "String#match": function () {
        !!"Hello World!".match(/o/);
      },
    },
  ])
  .run({ async: true });
复制代码


8. 测试结果预览

每秒执行次数越高的测试用例为最优,我们可以看到查找字符的最优解就是使用indexOf函数了。你是这样做的吗?

6.png


文章源码:


  1. benchmark-javascript


其他方案:


  1. jsbench:Web版基准测试,网站显示Inspired by Benchmark.js, Jsperf.com and Jsfiddle.com.
  2. jsperf:应该是个老牌基准测试网站,目前是服务器500了,我是没能打开过,看Github可以自己搭建使用。



相关文章
|
2月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
9天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
1月前
|
人工智能 监控 JavaScript
模拟依赖关系和 AI 是Vue.js测试的下一个前沿领域
模拟依赖关系和 AI 是Vue.js测试的下一个前沿领域
27 1
|
1月前
|
JavaScript 前端开发
JavaScript - 测试 Prototype
JavaScript - 测试 Prototype
9 0
|
1月前
|
JavaScript 前端开发
JavaScript - 测试 jQuery
JavaScript - 测试 jQuery
12 0
|
3月前
|
Web App开发 应用服务中间件 定位技术
three.js:三维模型加载量测试
three.js:三维模型加载量测试
169 4
|
3月前
|
JavaScript 前端开发 测试技术
Vue.js开发者必看!Vue Test Utils携手端到端测试,打造无懈可击的应用体验,引领前端测试新风尚!
【8月更文挑战第30天】随着Vue.js的普及,构建可靠的Vue应用至关重要。测试不仅能确保应用质量,还能提升开发效率。Vue Test Utils作为官方测试库,方便进行单元测试,而结合端到端(E2E)测试,则能构建全面的测试体系,保障应用稳定性。本文将带你深入了解如何使用Vue Test Utils进行单元测试,通过具体示例展示如何测试组件行为;并通过Cypress进行E2E测试,确保整个应用流程的正确性。无论是单元测试还是E2E测试,都能显著提高Vue应用的质量,让你更加自信地交付高质量的应用。
66 0
|
3月前
|
JavaScript 前端开发 应用服务中间件
【qkl】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的高中信息技术课程在线测试系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的高中信息技术课程在线测试系统附带文章和源代码部署视频讲解等
50 6
|
5月前
|
前端开发 JavaScript 算法
JavaScript事件监听测试代码
JavaScript事件监听测试代码
32 0