2013-01-09 59 views
2

我只是發現了其他的一天,Node.js的有一個叫的Node.js process.hrtime()基準錯誤

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 < 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)); 
    }); 
} 
+0

我明白了!這可以簡化並更正我的代碼!謝謝。 – krb686

+0

@ krb686沒問題! – loganfsmyth