2

先日、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 <0のコードブロックに入ることがあります。非同期モジュールが正しく機能し、タイマーが正しく機能している場合、これは発生しないはずです。何か助けはありますか?

4

1 に答える 1

7

処理している値は浮動小数点数ではありません! 値を追加して float 値を取得することはできません。たとえば、時間が 1 秒と 1 ナノ秒の場合、float 値は1.000000001ではなくになり1.1ます。また、hrtime引数をとって 2 つの値の差を見つけることもできます。

次のように値を処理する必要があります。

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 に答える