window.performance.now () äquivalent in nodejs?


77

Ich denke, die Frage ist einfach.

Ich suche nach etwas, das window.performance.now () in der V8-Engine von nodejs ähnelt.

Im Moment benutze ich nur: -

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

Ich habe jedoch gelesen, dass window.performance.now () aufgrund der hier definierten Daten viel genauer ist als die Verwendung des Datums .

Antworten:


50

Ich möchte nur erwähnen, dass drei der Gründe, die der Autor für die Bevorzugung der Timing-API im Browser angibt, nicht direkt auf eine Knotensituation zutreffen, und der vierte, die Ungenauigkeit der Javscript-Zeit, zitiert einen Artikel aus dem Jahr 2008. und ich würde dringend davor warnen, sich in Bezug auf die Leistungsspezifikationen von Javascript auf älteres Material zu verlassen, insbesondere angesichts der jüngsten Runde von Leistungsverbesserungen, die alle Engines zur Unterstützung von "HTML5" -Apps vorgenommen haben.

Als Antwort auf Ihre Frage sollten Sie sich jedoch ansehen process.hrtime()

UPDATE: Das presentPaket (erhältlich über npm install present) enthält etwas Zucker, hrtimewenn Sie es möchten.

Hinweis: Seit der Version 8.5.0 von Node können Sie performance.now () verwenden.


Ja, das ist genau das, was ich brauche. Vielen Dank. Ich werde auch einen Blick darauf werfen present.
Schrei

Es gibt auch die entsprechend benannte npmjs.com/package/performance-now
Der Hochstapler

Welcher Autor? Bitte geben Sie den Kontext in Ihrer Antwort an.
Edward D'Souza

1
Der Autor des Links, der in der ursprünglichen Frage gepostet wurde, ist offensichtlich. Die Frage ist der Kontext. Das Hinzufügen wäre eine Redundanz, kein Kontext.
Barry-Johnson


30

Hier ist eine Verknüpfung process.hrtime(), die Millisekunden anstelle von Mikrosekunden zurückgibt:

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

Verwendung:

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

Gibt etwas wie "Took 200ms" aus


15

Wie wäre es mit?

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

1
Passen Sie auf console.time () auf, wenn Sie Versprechen verwenden, warten usw. Das Paar time () / timeEnd () scheint mit dem globalen Status zu funktionieren. Wenn Sie dasselbe Tag parallel zeitlich festlegen, funktionieren die Dinge nicht richtig.
Geschoren

Das mag funktionieren, aber wenn Sie diese Zeit pragmatisch festhalten möchten, ist dies (process.hrtime ()) Ihre einzige andere "in Bearbeitung" -Methode. Sie könnten einen übergeordneten Prozess erstellen und stdout beobachten, aber das ist ein letzter Ausweg. EDIT: Oder es sieht so aus, als ob es die Performance Timing API in NodeJS ab 8.5+ gibt - Nodejs.org/api/…
Eric Hodonsky

1

Hier ist eine Typescript-Version mit process.hrtime () , basierend auf der Antwort von 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;

Verwendung:

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

const benchmark = new Benchmark();

console.log(benchmark.elapsed());

1

Um es zusammenzufassen und zu vermeiden 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
Warum sollten wir vermeiden wollen perf_hooks?
Falscher

3
Da es aus Gründen der Abwärtskompatibilität in Node v8.5.0 hinzugefügt wurde, ist dies unter bestimmten Umständen möglicherweise erforderlich ...
loretoparisi

Vielen Dank für die Erklärung, macht Sinn!
Falscher

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.