基准异步代码 (Benchmark.js, Node.js)
Benchmark Asynchronous Code (Benchmark.js, Node.js)
我想使用 Benchmark.js 模块来测试一些用 node.js 编写的异步代码。具体来说,我想向两台服务器(一台用节点编写,一台用 PHP 编写)发出约 10,000 个请求,并跟踪每台服务器完成所有请求需要多长时间。
我打算编写一个简单的节点脚本来使用 Benchmark 触发这些请求,但我对如何将它与异步代码一起使用感到有点困惑。通常在节点模块中,当您的异步代码完成时,或者从函数返回 Promise 等时,您会调用某种回调。但是对于 Benchmark,从我在文档中阅读的所有内容来看,它似乎并不完全处理异步。
有谁知道我应该做什么或看什么?如果需要,我可以手动编写基准测试;这似乎是一个足够常见的用例,Benchmark 或其他人可能已经在他们的专业级测试库中实现了它。
感谢任何指导,
~内特
没有很好的文档记录,但这是一个 PoC:
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()
我在尝试测试异步函数时遇到了同样的问题。这是我最终在 Code Sand Box. Here is the link 上使用到基准文档的示例,其中它给出了一个使用 defer
属性 的示例。
这里是我在 Node.js 中使用的代码,供任何出现并希望看到 deffered
与 async/await
一起使用的人使用。我希望有人觉得这有用!
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 });
我想使用 Benchmark.js 模块来测试一些用 node.js 编写的异步代码。具体来说,我想向两台服务器(一台用节点编写,一台用 PHP 编写)发出约 10,000 个请求,并跟踪每台服务器完成所有请求需要多长时间。
我打算编写一个简单的节点脚本来使用 Benchmark 触发这些请求,但我对如何将它与异步代码一起使用感到有点困惑。通常在节点模块中,当您的异步代码完成时,或者从函数返回 Promise 等时,您会调用某种回调。但是对于 Benchmark,从我在文档中阅读的所有内容来看,它似乎并不完全处理异步。
有谁知道我应该做什么或看什么?如果需要,我可以手动编写基准测试;这似乎是一个足够常见的用例,Benchmark 或其他人可能已经在他们的专业级测试库中实现了它。
感谢任何指导, ~内特
没有很好的文档记录,但这是一个 PoC:
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()
我在尝试测试异步函数时遇到了同样的问题。这是我最终在 Code Sand Box. Here is the link 上使用到基准文档的示例,其中它给出了一个使用 defer
属性 的示例。
这里是我在 Node.js 中使用的代码,供任何出现并希望看到 deffered
与 async/await
一起使用的人使用。我希望有人觉得这有用!
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 });