window.performance.now () еквівалент у nodejs?


79

Я думаю, що питання прямо вперед.

Я шукаю щось подібне до window.performance.now () у движку nodejs V8.

Зараз я просто використовую: -

var now = Date.now();
//do some processing..
console.log("time elapsed:", Date.now() - now);

Але я прочитав, що window.performance.now () набагато точніше, ніж використання дати, через те, що тут визначено .

Відповіді:


50

Я б лише зазначив, що три з причин, які автор наводить щодо переваги API синхронізації у браузері, здається, не стосуються безпосередньо ситуації вузла, а четверта, неточність часу Javscript, цитує статтю 2008 року, і я настійно застерігаю не покладатися на старі матеріали щодо специфіки продуктивності Javascript, особливо з огляду на нещодавній цикл поліпшень продуктивності, які всі механізми зробили для підтримки програм "HTML5".

Однак, відповідаючи на ваше запитання, варто поглянути на process.hrtime()

ОНОВЛЕННЯ: presentУпаковка (доступна через npm install present) містить трохи цукру, hrtimeякщо вам це потрібно.

Примітка: Починаючи з версії 8.5.0 Node , ви можете використовувати performance.now ()


Так, це саме те, що мені потрібно. Дякую. Я теж подивлюсь present.
крик

Існує також відповідна назва npmjs.com/package/performance-now
Der Hochstapler

Який автор? Будь ласка, включіть контекст у свою відповідь.
Едвард Д'Суза,

1
Автор посилання, розміщеного в оригінальному питанні, очевидно. Питання в контексті. Додавання цього було б надмірністю, а не контекстом.
barry-johnson


30

Ось ярлик, process.hrtime()який повертає мілісекунди замість мікросекунд:

function clock(start) {
    if ( !start ) return process.hrtime();
    var end = process.hrtime(start);
    return Math.round((end[0]*1000) + (end[1]/1000000));
}

Використання:

var start = clock();
// do some processing that takes time
var duration = clock(start);
console.log("Took "+duration+"ms");

Виведе щось на зразок "Взяв 200 мс"


15

Що стосовно?

console.time('FooTimer');
// do the work
console.timeEnd('FooTimer');

1
Остерігайтеся console.time (), якщо ви використовуєте обіцянки, очікування тощо. Пара time () / timeEnd (), здається, працює, використовуючи глобальний стан - якщо паралельно встановлювати один і той же тег, все не буде працювати належним чином.
Укорочений

Отже, це може спрацювати, але якщо ви хочете прагматично дотриматися цього часу, натомість це (process.hrtime ()) - ваш єдиний інший "в процесі" спосіб. Ви можете створити батьківський процес і спостерігати за stdout, але це крайній захід. РЕДАКТУВАТИ: Або схоже, що у nodejs є час синхронізації продуктивності api станом на 8.5+ - nodejs.org/api/…
Ерік Ходонскі

1

Ось версія Typescript з process.hrtime () , заснована на відповіді NextLocal :

class Benchmark {

    private start = process.hrtime();

    public elapsed(): number {
        const end = process.hrtime(this.start);
        return Math.round((end[0] * 1000) + (end[1] / 1000000));
    }
}

export = Benchmark;

Використання:

import Benchmark = require("./benchmark");

const benchmark = new Benchmark();

console.log(benchmark.elapsed());

1

Підбиваючи підсумки та уникаючи використання perf_hooks

const performance = {
        now: function(start) {
            if ( !start ) return process.hrtime();
            var end = process.hrtime(start);
            return Math.round((end[0]*1000) + (end[1]/1000000));
        }
    }
console.log('performance', performance.now());

1
Чому ми хочемо уникати perf_hooks?
Неправдивий

3
Оскільки він був доданий у Node v8.5.0 так для зворотної сумісності, що, можливо, потрібно за певних обставин ...
loretoparisi

Велике спасибі за пояснення, має сенс!
Неправдивий

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.