参数将是:(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 } }

返回的数字(最小值,最大值和平均值)是经过的时间(以毫秒为单位)。

10-07 12:56