it-swarm.com.de

Wie bekomme ich eine Microtime in Node.js?

Wie kann ich den genauesten Zeitstempel in Node.js ermitteln?

ps Meine Version von Node.js ist 0.8.X und die Erweiterung node-microtime funktioniert für mich nicht (Absturz bei der Installation) 

69
NiLL

new Date().getTime()? Dies gibt Ihnen einen Zeitstempel in Millisekunden, der von JS am genauesten angegeben wird.

Update: Wie von vaughan angegeben, ist process.hrtime() in Node.js verfügbar - seine Auflösung beträgt Nanosekunden und ist daher viel höher. Dies bedeutet auch nicht, dass es genauer sein muss.

PS .: Um es klarer zu machen, gibt process.hrtime() ein Tupel Array zurück, das die aktuelle hochauflösende Echtzeit in [Sekunden, Nanosekunden] enthält.

86

In Node.js wird "Hochauflösungszeit" über process.hrtime zur Verfügung gestellt. Es gibt ein Array mit dem ersten Element in Sekunden und dem zweiten Element mit den verbleibenden Nanosekunden zurück.

Um die aktuelle Zeit in Mikrosekunden abzurufen, führen Sie folgende Schritte aus:

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

(Dank an itaifrenkel für den Hinweis auf einen Fehler in der obigen Konvertierung.)

In modernen Browsern ist Zeit mit Mikrosekundengenauigkeit als performance.now verfügbar. Siehe https://developer.mozilla.org/en-US/docs/Web/API/Performance/now für Dokumentation.

Ich habe eine Implementierung dieser Funktion für Node.js gemacht, die auf process.hrtime basiert. Diese Funktion ist relativ schwierig zu verwenden, wenn Sie nur die Zeitdifferenz zwischen zwei Punkten in einem Programm berechnen möchten. Siehe http://npmjs.org/package/performance-now . Je nach Spezifikation gibt diese Funktion die Zeit in Millisekunden an, aber es ist ein Float mit einer Genauigkeit von weniger als einer Millisekunde.

In Version 2.0 dieses Moduls sind die gemeldeten Millisekunden relativ zu dem Zeitpunkt, zu dem der Knotenprozess gestartet wurde (Date.now() - (process.uptime() * 1000)). Sie müssen dies zum Ergebnis hinzufügen, wenn Sie einen Zeitstempel ähnlich wie Date.now() wünschen. Beachten Sie auch, dass Sie Date.now() - (process.uptime() * 1000) neu berechnen müssen. Sowohl Date.now als auch process.uptime sind für genaue Messungen äußerst unzuverlässig.

Um die aktuelle Zeit in Mikrosekunden abzurufen, können Sie so etwas verwenden.

var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)

Siehe auch: Bietet JavaScript einen Timer mit hoher Auflösung?

154
Myrne Stol
now('milli'); //  120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; //  120335360904333

Bekannt, dass now ist: 

const now = (unit) => {

  const hrTime = process.hrtime();

  switch (unit) {

    case 'milli':
      return hrTime[0] * 1000 + hrTime[1] / 1000000;

    case 'micro':
      return hrTime[0] * 1000000 + hrTime[1] / 1000;

    case 'nano':
      return hrTime[0] * 1000000000 + hrTime[1];

    default:
      return hrTime[0] * 1000000000 + hrTime[1];
  }

};
13
Abdennour TOUMI

Es gibt auch https://github.com/wadey/node-microtime :

> var microtime = require('microtime')
> microtime.now()
1297448895297028
6
mikemaccana

Node.js Nanotimer

Ich habe eine Wrapper-Bibliothek/ein Objekt für node.js über den Funktionsaufruf process.hrtime geschrieben. Es verfügt über nützliche Funktionen, wie z. B. das Synchronisieren synchroner und asynchroner Tasks, die in Sekunden, Millisekunden, Mikro oder sogar Nano angegeben werden, und folgt der Syntax des eingebauten Javascript-Timers, um vertraut zu sein.

Zeitgeberobjekte sind auch diskret, so dass Sie beliebig viele davon haben können, wobei jeweils ein setTimeout- oder setInterval-Prozess ausgeführt wird. 

Es heißt Nanotimer . Hör zu!

5
krb686

So arbeiten Sie mit mehr Präzision als Date.now(), jedoch mit Millisekunden in Float-Genauigkeit:

function getTimeMSFloat() {
    var hrtime = process.hrtime();
    return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
3
Ross

Der Datentyp BigInt wird seit Node.js 10.7.0 unterstützt. (siehe auch die Ankündigung des blog). Für diese unterstützten Versionen von Node.js wird die process.hrtime([time]) -Methode jetzt als "Legacy" betrachtet und durch die process.hrtime.bigint() -Methode ersetzt.

Die bigint-Version der process.hrtime()-Methode gibt die aktuelle Echtzeitauflösung mit hoher Auflösung in einer bigint zurück.

const start = process.hrtime.bigint();
// 191051479007711n

setTimeout(() => {
  const end = process.hrtime.bigint();
  // 191052633396993n

  console.log(`Benchmark took ${end - start} nanoseconds`);
  // Benchmark took 1154389282 nanoseconds
}, 1000);

tl; dr

  • Node.js 10.7.0+ - Verwenden Sie process.hrtime.bigint()
  • Andernfalls - Verwenden Sie process.hrtime()
1
d4nyll

es gibt npm-Pakete, die an die Systemfunktion gettimeofday (), , gebunden werden, die unter Linux einen Zeitstempel in Mikrosekundengenauigkeit zurückgibt. Suchen Sie nach Npm gettimeofday. Aufruf von C ist schneller als process.hrtime()

0
Andras

Erhalte hrtime als einzelne Zahl in einer Zeile:

const begin = process.hrtime();
// ... Do the thing you want to measure
const nanoSeconds = process.hrtime(begin).reduce((sec, nano) => sec * 1e9 + nano)

Array.reduce verwendet bei Angabe eines einzelnen Arguments das erste Element des Arrays als anfänglichen accumulator Wert. Man könnte 0 als Anfangswert verwenden und dies würde auch funktionieren, aber warum sollte man den zusätzlichen * 0 verwenden.

0

Ein neues Schreiben zum besseren Verständnis:

const hrtime = process.hrtime();     // [0] is seconds, [1] is nanoseconds

let nanoSeconds = (hrtime[0] * 1e9) + hrtime[1];    // 1 second is 1e9 nano seconds
console.log('nanoSeconds:  ' + nanoSeconds);
//nanoSeconds:  97760957504895

let microSeconds = parseInt(((hrtime[0] * 1e6) + (hrtime[1]) * 1e-3));
console.log('microSeconds: ' + microSeconds);
//microSeconds: 97760957504

let milliSeconds = parseInt(((hrtime[0] * 1e3) + (hrtime[1]) * 1e-6));
console.log('milliSeconds: ' + milliSeconds);
//milliSeconds: 97760957

Quelle: https://nodejs.org/api/process.html#process_process_hrtime_time