2

前几天我刚刚发现 Node.js 有一个高分辨率的计时器函数,叫做

进程.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 < 0 的代码块。如果异步模块正常工作并且计时器正常工作,这不应该发生。有什么帮助吗?

4

1 回答 1

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));
    });
}
于 2013-01-09T17:20:08.777 回答