Node.js process.hrtime()基准测试bug

时间:2013-01-09 17:00:16

标签: node.js

前几天我发现Node.js有一个名为

的高分辨率计时器功能

process.hrtime

这个计时器据说具有纳秒分辨率,这很棒,因为现在我可以比使用Date模块更精确地计算时间。

无论如何我正在使用这个新的计时器来尝试创建一个Timer对象,可以将不同的任务传递给它。不幸的是,我得到一些奇怪的负面结果让我质疑这个假设的“高分辨率”计时器的准确性和可靠性。

让我告诉你我的代码:

hrTimer.js

//IMPORTS
var async = require('async');

HrTimer = {

    time: function(task) {
        var t1 = t2 = '';

        async.series([
            function(callback){
                t1 = process.hrtime();
                callback();
            },
            task,
            function(callback){
                t2 = process.hrtime();
                callback();
            }
        ]);


        var t1 = t1[0].toString() + '.' + t1[1].toString();
        var t2 = t2[0].toString() + '.' + t2[1].toString();


        var dif = parseFloat(t2)-parseFloat(t1);

        if(dif < 0){

            debugger;
            console.log(t1);
            console.log(t2);
        }

        return dif;
    }
};


module.exports = HrTimer;

所以有时它会进入代码块,其中dif&lt; 0.如果异步模块工作正常,并且计时器正常工作,则不会发生这种情况。有什么帮助吗?

1 个答案:

答案 0 :(得分:7)

您正在处理的值不是浮点数!您不能只是附加值来获取浮点值。例如,如果时间是1秒和1纳秒,则浮点值将是1.000000001,而不是1.1。此外,hrtime可以使用参数来查找两个值之间的差异。

你需要像这样处理这个值:

var t2 = process.hrtime(t1);

如您所知,这将返回数组中的值。我建议只使用数组值。

那就是说,你所拥有的也不会异步工作,所以要么放弃async.series调用而只是这样做:

var t1 = process.hrtime();
task();
return process.hrtime(t1);

或异步实现:

time: function(task, doneCb) {
    var t1 = process.hrtime();
    task(function(){
      doneCb(process.hrtime(t1));
    });
}