2013-01-09 3 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; 

Так что иногда войдет в блок кода, где диф < 0. Это не должно произойти при условии модуль асинхронной работает правильно , и таймер работает правильно. Любая помощь?

ответ

7

Значения, которые вы обрабатываете, не плавают! Вы не можете просто добавить значения, чтобы получить значение float. Например, если время составляет 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

Смежные вопросы