基准测试异步代码(Benchmark.js,Node.js)

15
我想使用Benchmark.js模块测试在node.js中编写的一些异步代码。具体来说,我想向两个服务器(一个用node编写,一个用PHP编写)发送约10,000个请求,并跟踪每个服务器完成所有请求所需的时间。
我打算编写一个简单的node脚本,使用Benchmark来发出这些请求,但我对如何在异步代码中使用它有点困惑。通常在node模块中,当您的异步代码完成时,会调用某种回调函数,或者从函数返回Promise等。但根据文档中的所有内容来看,Benchmark似乎根本不处理异步操作。
有人知道我应该做什么或查看什么吗?如果需要,我可以手动编写基准测试;只是似乎Benchmark或其他人可能已经在他们的专业测试库中实现了这个常见的用例。
感谢任何指导, ~ Nate
2个回答

16

虽然文档并不是很完备,但这里有一个概念验证:

var Benchmark = require('benchmark');
var suite     = new Benchmark.Suite();

suite.add(new Benchmark('foo', {
  // a flag to indicate the benchmark is deferred
  defer : true,

  // benchmark test function
  fn : function(deferred) {
    setTimeout(function() {
      deferred.resolve();
    }, 200);
  }
})).on('complete', function() {
  console.log(this[0].stats);
}).run();

Benchmark.js v2 稍微更改了语法:

var Benchmark = require('benchmark');
var suite = new Benchmark.Suite;

suite.add('foo', {
  defer: true,
  fn: function (deferred) {
    setTimeout(function() {
      deferred.resolve();
    }, 200);
  }
}).on('complete', function () {
  console.log(this[0].stats)
}).run()

1
哦,好的 - 我确实看到了延迟对象;没意识到它是干什么用的。谢谢! - opensourcejunkie
1
是的,正如我所说的,这个文档写得不太好 :-( 顺便说一下,我刚刚推送了 benchr 的第一个版本,它是一个类似于 Mocha 的包装器,用于简化 Benchmark.js。不过它仍然在开发中。 - robertklep
哦,太棒了 - 我喜欢摩卡,你的语法肯定非常熟悉。我会试一下的。benchr和bencha之间有什么区别? - opensourcejunkie
据我所知,bencha根本不支持异步测试用例。我也不喜欢它要求你创建一个bench/目录的方式,而且它也没有可配置性。 - robertklep
明白了,谢谢。我昨天试用了一下,对于配置选项并不是很满意(例如它总是运行index.js而不提供像mocha --grep这样的选项)。但是它确实支持异步,与mocha相同的方式 - 在测试函数参数中指定done回调。感谢您的所有帮助,期待在repo中看到您的解决方案! - opensourcejunkie

2
当我尝试测试异步函数时,我遇到了同样的问题。以下是我在Code Sand Box上使用的示例。这里是关于使用defer属性的示例的链接,可以查看基准文档。
这是我在Node.js中使用的代码,供任何想要查看async/awaitdeffered一起使用的人参考。希望有人会发现这个有用!
const Benchmark = require('benchmark');
const suite = new Benchmark.Suite();
const promiseCount = 10;
const setupArray = Array.from(Array(promiseCount)).map((_, i) => i);

const sleep = (ms = 500) =>
  new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, ms);
  });

const asyncFunction = async (name, index) => {
  await sleep(100);
  return `${name}_${index}`;
};

suite
  .add("Promise.all", {
    defer: true,
    fn: async function(deferred) {
      const promiseArray = setupArray.map(asyncFunction);
      await Promise.all(promiseArray);
      deferred.resolve();
    }
  })
  .add("For loop", {
    defer: true,
    fn: async function(deferred) {
      const final = [];

      for (let i = 0; i < promiseCount; i++) {
        const data = await asyncFunction(setupArray[i], i);
        final.push(data);
      }
      deferred.resolve();
    }
  })
  .on("cycle", function(event) {
    console.log(String(event.target));
  })
  .on("complete", function() {
    console.log("Fastest is " + this.filter("fastest").map("name"));
  })
  .run({ async: true });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接