参数将是:(functionToCall,argumentArray,numberOfCalls)。它返回一个对象,该对象将告诉我们每个类别的成功和失败次数:平均时间,最小和最大。回调可以假定为函数(错误,结果)。伪代码将类似于
measureWithCallback = function(functionToCall, argumentArray,numberOfCalls, callback) {
var perfResults = { success: { }, failure: { } };
... measure ...
callback(null, perfResults);
}
一次调用functionToCall,使用argumentsArgumentArray调用numberOfCalls次
argumentArray.push(function(error, success) {
// record results
// call next
});
使用提供的参数调用函数:
functionToCall.apply(argumentArray);
最佳答案
我之前误解了,但没有意识到正在测试的函数(functionToCall
)也需要传递一个回调。
function measureWithCallback(functionToCall,
argumentArray,
numberOfCalls,
callback) {
var args = argumentArray.concat([callFn]);
callI = 0,
perfResults = { success: [], failure: [] },
start = 0;
callFn();
function callFn(err) {
// Store the results for this call.
if (callI > 0)
perfResults[err ? 'failure' : 'success'].push(Date.now() - start);
if (callI < numberOfCalls) {
callI++;
start = Date.now();
functionToCall.apply(null, args);
} else {
callback(null, aggregateResults(perfResults));
}
}
function aggregateResults(results) {
return {
success : totals(results.success),
failure : totals(results.failure)
};
function totals(arr) {
return {
avg : arr.reduce(add, 0) / arr.length,
max : Math.max.apply(Math, arr),
min : Math.min.apply(Math, arr),
count : arr.length
};
function add(x, y) {
return x + y;
}
}
}
}
measureWithCallback
可以使用以下表达式进行测试:measureWithCallback(
fs.appendFile.bind(fs),
['./node.txt', 'testing.\n'],
3000,
console.log.bind(console)
);
和:
measureWithCallback(testFn, [], 30, console.log.bind(console));
function testFn(cb) {
var r = Math.random();
setTimeout(cb.bind(null, r > 0.5 ? null : new Error()), Math.floor(r * 1000));
}
第二个示例产生如下输出:
null { success: { avg: 802.4444444444445, max: 996, min: 506, count: 18 },
failure: { avg: 287.9166666666667, max: 485, min: 15, count: 12 } }
返回的数字(最小值,最大值和平均值)是经过的时间(以毫秒为单位)。