Ошибка Node.js process.hrtime ()

На днях я узнал, что 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;

So sometimes it will enter the code block where dif < 0. This shouldn't happen provided the async module is working properly, and the timer is working properly. Any help?

2
nl ja de

1 ответы

Значения, которые вы обрабатываете, не являются плавающими! Вы не можете просто добавить значения, чтобы получить значение float. Например, если время составляет 1 секунду и 1 наносекунду, значение float будет 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));
    });
}
7
добавлено
@ krb686 Нет проблем!
добавлено автор loganfsmyth, источник
Я вижу! Это упрощает и исправляет мой код! Спасибо.
добавлено автор krb686, источник
pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

Node.js — русскоговорящее сообщество
Node.js — русскоговорящее сообщество
4 160 участник(ов)

Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было комфортным. Правила: https://rudevs.network/ByaMH6un7 См. также: @js_ru, @react_js, @angular_ru, @vuejs_ru, @devops_ru Вакансии и поиск работы: @javascript_jobs и @nodejs_jobs

Node: русскоязычное сообщество
Node: русскоязычное сообщество
28 участник(ов)

Независимое сообщество node разработчиков на русском языке. Правила: https://node-chat.ru/ Партнеры: @react_ru @ru_vuejs @nuxtjs_ru @ru_docker @nlp_ru