Hochpräzise Zeitmessung in Node.js: Die besten Praktiken
Wenhao Wang
Dev Intern · Leapcell

Wenn Sie die Ausführungszeit Ihres Node.js-Codes testen würden, welche Timing-Funktion würden Sie wählen? Die ersten Optionen, die einem typischerweise in den Sinn kommen, sind Date.now
oder Date.getTime
.
Fazit zuerst:
Priorisieren Sie in Node.js-Programmen process.hrtime
, gefolgt von performance.now
und schließlich Date.now
.
Diese Präferenz basiert auf Überlegungen zur Präzision und Taktsynchronisation.
Erklärung
Einschränkungen von Date.now
- Die Präzision der zurückgegebenen Zeit liegt auf Millisekundenebene (10^-3), was für viele Anwendungsfälle nicht ausreicht.
- Sie wird von der Systemzeit beeinflusst und kann durch Anpassungen anderer Software beeinflusst werden.
Um eine höhere Präzision und Unabhängigkeit von der Systemzeit zu erreichen, hat das W3C den Standard High Resolution Time Level 2 festgelegt. Der Abschnitt 6. Monotonic Clock legt fest, dass standardkonforme Implementierungen eine "monotone" globale Systemuhr bereitstellen müssen.
Dieser Standard wurde sowohl in Node.js als auch in Browsern über das performance
-Objekt implementiert. Wir können performance.now
verwenden, um einen Zeitstempel relativ zu einem Startpunkt zu erhalten, mit den folgenden Merkmalen:
- Im Gegensatz zu anderen zeitbezogenen Funktionen in JavaScript (z. B.
Date.now
) gibtperformance.now()
eine Gleitkommazahl zurück, wodurch eine Mikrosekunden-Präzision (10^-6) erreicht wird. - Die Zeit erhöht sich mit einer konstanten Rate und wird nicht durch Systemzeitanpassungen (z. B. Änderungen durch andere Software) beeinflusst.
- Gemäß der Standarddefinition ermöglicht
performance.now()
Uhrdrift.
Eine kurze Anmerkung zur Uhrdrift
Uhrdrift entsteht aus dem Konzept der Taktsynchronisation, das darauf abzielt, mehrere unabhängige Uhren abzugleichen. In der Realität können Uhren jedoch auch nach der Synchronisation im Laufe der Zeit aufgrund geringfügiger Unterschiede in ihren Taktfrequenzen abdriften, was zu unterschiedlichen angezeigten Zeiten führt.
Gibt es eine genauere Uhr?
Ja, in Node.js gibt es die Methode process.hrtime
:
- Eingeführt in Node.js v0.7.6, mit ausgezeichneter Kompatibilität (die aktuelle Version ist bereits v22 LTS).
- Bietet eine Präzision im Nanosekundenbereich (10^-9).
- Immun gegen Uhrdrift.
Die Methode process.hrtime
wurde speziell für die Messung von Zeitintervallen entwickelt.
Hinweis: Die Browserumgebung unterstützt hrtime
nicht, daher ist die beste in Browsern erreichbare Präzision die Mikrosekundenebene über performance.now
(vorbehaltlich Implementierungsunterschieden zwischen den Browsern).
Die Verwendung von process.hrtime
erfordert jedoch die Beachtung seiner Verwendung. Der erste Aufruf gibt einen time
-Wert zurück, der als Eingabeparameter für nachfolgende Aufrufe verwendet werden muss:
const NS_PER_SEC = 1e9; const time = process.hrtime(); // Erster Aufruf, gibt die anfängliche `time`-Variable zurück // [ 1800216, 25 ] setTimeout(() => { const diff = process.hrtime(time); // Verwenden Sie die erste zurückgegebene `time` als Eingabe für den zweiten Aufruf, um die Zeitdifferenz zu berechnen // [ 1, 552 ] console.log(`Benchmark took ${diff[0] * NS_PER_SEC + diff[1]} nanoseconds`); // Benchmark took 1000000552 nanoseconds }, 1000);
Dies schließt den Hauptinhalt ab und führt natürlich zu dem Fazit am Anfang dieses Abschnitts.
Zusätzliche Hinweise
Sie können auch die Methode hrtime.bigint
verwenden. Dies ist eine BigInt-basierte Version von process.hrtime
(BigInt-Unterstützung wurde in v10.4 eingeführt), die die aktuelle hochpräzise tatsächliche Zeit liefert.
Diese Methode ist bequemer als process.hrtime
, da sie keinen zusätzlichen time
-Eingabeparameter benötigt. Sie können die Zeitdifferenz berechnen, indem Sie einfach die Ergebnisse von zwei Aufrufen subtrahieren:
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);
Wir sind Leapcell, Ihre erste Wahl für die Bereitstellung von Node.js-Projekten in der Cloud.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Sprachen-Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Setzen Sie unbegrenzt Projekte kostenlos ein
- zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und Protokollierung für umsetzbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Gleichzeitigkeit.
- Kein Betriebsaufwand – konzentrieren Sie sich einfach auf das Bauen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ