前几天我发现Node.js有一个名为
的高分辨率计时器功能这个计时器据说具有纳秒分辨率,这很棒,因为现在我可以比使用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.如果异步模块工作正常,并且计时器正常工作,则不会发生这种情况。有什么帮助吗?
答案 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));
});
}