APIs zur Leistungsmessung
[Stabil: 2 - Stabil]
Stabil: 2 Stabilität: 2 - Stabil
Quellcode: lib/perf_hooks.js
Dieses Modul bietet eine Implementierung einer Teilmenge der W3C Web Performance APIs sowie zusätzliche APIs für Node.js-spezifische Leistungsmessungen.
Node.js unterstützt die folgenden Web Performance APIs:
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver(items => {
console.log(items.getEntries()[0].duration)
performance.clearMarks()
})
obs.observe({ type: 'measure' })
performance.measure('Start to Now')
performance.mark('A')
doSomeLongRunningProcess(() => {
performance.measure('A to Now', 'A')
performance.mark('B')
performance.measure('A to B', 'A', 'B')
})
const { PerformanceObserver, performance } = require('node:perf_hooks')
const obs = new PerformanceObserver(items => {
console.log(items.getEntries()[0].duration)
})
obs.observe({ type: 'measure' })
performance.measure('Start to Now')
performance.mark('A')
;(async function doSomeLongRunningProcess() {
await new Promise(r => setTimeout(r, 5000))
performance.measure('A to Now', 'A')
performance.mark('B')
performance.measure('A to B', 'A', 'B')
})()
perf_hooks.performance
Hinzugefügt in: v8.5.0
Ein Objekt, das verwendet werden kann, um Leistungskennzahlen von der aktuellen Node.js-Instanz zu erfassen. Es ähnelt window.performance
in Browsern.
performance.clearMarks([name])
[Historie]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
name
<string>
Wenn name
nicht angegeben ist, werden alle PerformanceMark
-Objekte aus der Performance-Zeitleiste entfernt. Wenn name
angegeben ist, wird nur die benannte Markierung entfernt.
performance.clearMeasures([name])
[Historie]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v16.7.0 | Hinzugefügt in: v16.7.0 |
name
<string>
Wenn name
nicht angegeben ist, werden alle PerformanceMeasure
-Objekte aus der Performance-Zeitleiste entfernt. Wenn name
angegeben ist, wird nur die benannte Messung entfernt.
performance.clearResourceTimings([name])
[Historie]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
name
<string>
Wenn name
nicht angegeben ist, werden alle PerformanceResourceTiming
-Objekte aus der Ressourcen-Zeitleiste entfernt. Wenn name
angegeben ist, wird nur die benannte Ressource entfernt.
performance.eventLoopUtilization([utilization1[, utilization2]])
Hinzugefügt in: v14.10.0, v12.19.0
utilization1
<Object> Das Ergebnis eines vorherigen Aufrufs voneventLoopUtilization()
.utilization2
<Object> Das Ergebnis eines vorherigen Aufrufs voneventLoopUtilization()
vorutilization1
.- Gibt zurück: <Object>
Die Methode eventLoopUtilization()
gibt ein Objekt zurück, das die kumulative Dauer der Zeit enthält, in der die Ereignisschleife sowohl im Leerlauf als auch aktiv war, als hochauflösender Millisekunden-Timer. Der Wert utilization
ist die berechnete Event Loop Utilization (ELU).
Wenn das Bootstrapping im Hauptthread noch nicht abgeschlossen ist, haben die Eigenschaften den Wert 0
. Die ELU ist in Worker-Threads sofort verfügbar, da das Bootstrapping innerhalb der Ereignisschleife erfolgt.
Sowohl utilization1
als auch utilization2
sind optionale Parameter.
Wenn utilization1
übergeben wird, wird die Differenz zwischen den active
- und idle
-Zeiten des aktuellen Aufrufs sowie der entsprechende utilization
-Wert berechnet und zurückgegeben (ähnlich wie bei process.hrtime()
).
Wenn utilization1
und utilization2
beide übergeben werden, wird die Differenz zwischen den beiden Argumenten berechnet. Dies ist eine Komfortoption, da die Berechnung der ELU im Gegensatz zu process.hrtime()
komplexer ist als eine einfache Subtraktion.
ELU ist ähnlich wie die CPU-Auslastung, misst jedoch nur Statistiken der Ereignisschleife und nicht die CPU-Nutzung. Sie stellt den Prozentsatz der Zeit dar, die die Ereignisschleife außerhalb des Ereignisproviders der Ereignisschleife (z. B. epoll_wait
) verbracht hat. Keine andere CPU-Leerlaufzeit wird berücksichtigt. Das folgende Beispiel zeigt, wie ein größtenteils inaktiver Prozess eine hohe ELU haben kann.
import { eventLoopUtilization } from 'node:perf_hooks'
import { spawnSync } from 'node:child_process'
setImmediate(() => {
const elu = eventLoopUtilization()
spawnSync('sleep', ['5'])
console.log(eventLoopUtilization(elu).utilization)
})
'use strict'
const { eventLoopUtilization } = require('node:perf_hooks').performance
const { spawnSync } = require('node:child_process')
setImmediate(() => {
const elu = eventLoopUtilization()
spawnSync('sleep', ['5'])
console.log(eventLoopUtilization(elu).utilization)
})
Obwohl die CPU während der Ausführung dieses Skripts größtenteils im Leerlauf ist, ist der Wert von utilization
1
. Dies liegt daran, dass der Aufruf von child_process.spawnSync()
verhindert, dass die Ereignisschleife fortgesetzt wird.
Das Übergeben eines benutzerdefinierten Objekts anstelle des Ergebnisses eines vorherigen Aufrufs von eventLoopUtilization()
führt zu undefiniertem Verhalten. Die Rückgabewerte geben nicht garantiert einen korrekten Zustand der Ereignisschleife wieder.
performance.getEntries()
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v16.7.0 | Hinzugefügt in: v16.7.0 |
- Gibt zurück: <PerformanceEntry[]>
Gibt eine Liste von PerformanceEntry
-Objekten in chronologischer Reihenfolge in Bezug auf performanceEntry.startTime
zurück. Wenn Sie nur an Performance-Einträgen bestimmter Typen oder mit bestimmten Namen interessiert sind, lesen Sie performance.getEntriesByType()
und performance.getEntriesByName()
.
performance.getEntriesByName(name[, type])
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v16.7.0 | Hinzugefügt in: v16.7.0 |
name
<string>type
<string>- Gibt zurück: <PerformanceEntry[]>
Gibt eine Liste von PerformanceEntry
-Objekten in chronologischer Reihenfolge in Bezug auf performanceEntry.startTime
zurück, deren performanceEntry.name
gleich name
ist und optional deren performanceEntry.entryType
gleich type
ist.
performance.getEntriesByType(type)
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v16.7.0 | Hinzugefügt in: v16.7.0 |
type
<string>- Gibt zurück: <PerformanceEntry[]>
Gibt eine Liste von PerformanceEntry
-Objekten in chronologischer Reihenfolge in Bezug auf performanceEntry.startTime
zurück, deren performanceEntry.entryType
gleich type
ist.
performance.mark(name[, options])
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. Das Argument name ist nicht mehr optional. |
v16.0.0 | Aktualisiert, um der User Timing Level 3-Spezifikation zu entsprechen. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
Erstellt einen neuen PerformanceMark
-Eintrag in der Performance-Timeline. Eine PerformanceMark
ist eine Unterklasse von PerformanceEntry
, deren performanceEntry.entryType
immer 'mark'
ist und deren performanceEntry.duration
immer 0
ist. Performance-Markierungen werden verwendet, um bestimmte signifikante Momente in der Performance-Timeline zu markieren.
Der erstellte PerformanceMark
-Eintrag wird in die globale Performance-Timeline aufgenommen und kann mit performance.getEntries
, performance.getEntriesByName
und performance.getEntriesByType
abgefragt werden. Wenn die Beobachtung durchgeführt wird, sollten die Einträge manuell mit performance.clearMarks
aus der globalen Performance-Timeline entfernt werden.
performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, global, cacheMode, bodyInfo, responseStatus[, deliveryType])
[History]
Version | Änderungen |
---|---|
v22.2.0 | Argumente bodyInfo, responseStatus und deliveryType hinzugefügt. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
timingInfo
<Object> Fetch-Timing-InforequestedUrl
<string> Die Ressourcen-URLinitiatorType
<string> Der Initiatorname, z. B.: 'fetch'global
<Object>cacheMode
<string> Der Cache-Modus muss eine leere Zeichenkette ('') oder 'local' seinbodyInfo
<Object> Fetch-Antwort-Body-InforesponseStatus
<number> Der Statuscode der AntwortdeliveryType
<string> Der Liefertyp. Standard:''
.
Diese Eigenschaft ist eine Erweiterung von Node.js. Sie ist in Webbrowsern nicht verfügbar.
Erstellt einen neuen PerformanceResourceTiming
-Eintrag in der Ressourcen-Timeline. Ein PerformanceResourceTiming
ist eine Unterklasse von PerformanceEntry
, dessen performanceEntry.entryType
immer 'resource'
ist. Performance-Ressourcen werden verwendet, um Momente in der Ressourcen-Timeline zu markieren.
Der erstellte PerformanceMark
-Eintrag wird in die globale Ressourcen-Timeline eingefügt und kann mit performance.getEntries
, performance.getEntriesByName
und performance.getEntriesByType
abgefragt werden. Wenn die Beobachtung durchgeführt wird, sollten die Einträge manuell mit performance.clearResourceTimings
aus der globalen Performance-Timeline gelöscht werden.
performance.measure(name[, startMarkOrOptions[, endMark]])
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v16.0.0 | Aktualisiert, um der User Timing Level 3-Spezifikation zu entsprechen. |
v13.13.0, v12.16.3 | Parameter startMark und endMark optional gemacht. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
name
<string>startMarkOrOptions
<string> | <Object> Optional.detail
<any> Zusätzliche optionale Details, die mit der Messung einbezogen werden sollen.duration
<number> Dauer zwischen Start- und Endzeit.end
<number> | <string> Zeitstempel, der als Endzeit verwendet werden soll, oder eine Zeichenkette, die eine zuvor aufgezeichnete Markierung identifiziert.start
<number> | <string> Zeitstempel, der als Startzeit verwendet werden soll, oder eine Zeichenkette, die eine zuvor aufgezeichnete Markierung identifiziert.
endMark
<string> Optional. Muss weggelassen werden, wennstartMarkOrOptions
ein <Object> ist.
Erstellt einen neuen PerformanceMeasure
-Eintrag in der Performance-Timeline. Ein PerformanceMeasure
ist eine Unterklasse von PerformanceEntry
, dessen performanceEntry.entryType
immer 'measure'
ist und dessen performanceEntry.duration
die Anzahl der Millisekunden misst, die seit startMark
und endMark
vergangen sind.
Das Argument startMark
kann eine beliebige existierende PerformanceMark
in der Performance-Timeline identifizieren oder kann eine der Zeitstempel-Eigenschaften identifizieren, die von der PerformanceNodeTiming
-Klasse bereitgestellt werden. Wenn die benannte startMark
nicht existiert, wird ein Fehler ausgelöst.
Das optionale endMark
-Argument muss eine beliebige existierende PerformanceMark
in der Performance-Timeline oder eine der Zeitstempel-Eigenschaften identifizieren, die von der PerformanceNodeTiming
-Klasse bereitgestellt werden. endMark
ist performance.now()
, wenn kein Parameter übergeben wird, andernfalls wird ein Fehler ausgelöst, wenn die benannte endMark
nicht existiert.
Der erstellte PerformanceMeasure
-Eintrag wird in die globale Performance-Timeline eingefügt und kann mit performance.getEntries
, performance.getEntriesByName
und performance.getEntriesByType
abgefragt werden. Wenn die Beobachtung durchgeführt wird, sollten die Einträge mit performance.clearMeasures
manuell aus der globalen Performance-Timeline entfernt werden.
performance.nodeTiming
Hinzugefügt in: v8.5.0
Diese Eigenschaft ist eine Erweiterung von Node.js. Sie ist in Webbrowsern nicht verfügbar.
Eine Instanz der Klasse PerformanceNodeTiming
, die Leistungskennzahlen für bestimmte operative Meilensteine von Node.js bereitstellt.
performance.now()
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
- Gibt zurück: <number>
Gibt den aktuellen hochauflösenden Millisekunden-Zeitstempel zurück, wobei 0 den Start des aktuellen node
-Prozesses darstellt.
performance.setResourceTimingBufferSize(maxSize)
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v18.8.0 | Hinzugefügt in: v18.8.0 |
Setzt die globale Puffergröße für die Leistungsmessung von Ressourcen auf die angegebene Anzahl von Leistungseintragsobjekten vom Typ "Ressource".
Standardmäßig ist die maximale Puffergröße auf 250 gesetzt.
performance.timeOrigin
Hinzugefügt in: v8.5.0
Die timeOrigin
gibt den hochauflösenden Millisekunden-Zeitstempel an, zu dem der aktuelle node
-Prozess begann, gemessen in Unix-Zeit.
performance.timerify(fn[, options])
[Verlauf]
Version | Änderungen |
---|---|
v16.0.0 | Die Histogramm-Option wurde hinzugefügt. |
v16.0.0 | Neu implementiert zur Verwendung von reinem JavaScript und zur Möglichkeit, asynchrone Funktionen zu zeitgesteuern. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
fn
<Funktion>options
<Objekt>histogram
<RecordableHistogram> Ein Histogramm-Objekt, das mitperf_hooks.createHistogram()
erstellt wurde und Laufzeitdauern in Nanosekunden aufzeichnet.
Diese Eigenschaft ist eine Erweiterung von Node.js. Sie ist in Webbrowsern nicht verfügbar.
Schließt eine Funktion innerhalb einer neuen Funktion ein, die die Laufzeit der eingeschlossenen Funktion misst. Ein PerformanceObserver
muss für den Ereignistyp 'function'
registriert sein, damit auf die Zeitdetails zugegriffen werden kann.
import { performance, PerformanceObserver } from 'node:perf_hooks'
function someFunction() {
console.log('hello world')
}
const wrapped = performance.timerify(someFunction)
const obs = new PerformanceObserver(list => {
console.log(list.getEntries()[0].duration)
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'] })
// Ein Performance-Timeline-Eintrag wird erstellt
wrapped()
const { performance, PerformanceObserver } = require('node:perf_hooks')
function someFunction() {
console.log('hello world')
}
const wrapped = performance.timerify(someFunction)
const obs = new PerformanceObserver(list => {
console.log(list.getEntries()[0].duration)
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'] })
// Ein Performance-Timeline-Eintrag wird erstellt
wrapped()
Wenn die eingeschlossene Funktion eine Zusage zurückgibt, wird ein finally-Handler an die Zusage angehängt, und die Dauer wird gemeldet, sobald der finally-Handler aufgerufen wird.
performance.toJSON()
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem performance -Objekt als Empfänger aufgerufen werden. |
v16.1.0 | Hinzugefügt in: v16.1.0 |
Ein Objekt, das die JSON-Repräsentation des performance
-Objekts ist. Es ähnelt window.performance.toJSON
in Browsern.
Ereignis: 'resourcetimingbufferfull'
Hinzugefügt in: v18.8.0
Das 'resourcetimingbufferfull'
-Ereignis wird ausgelöst, wenn der globale Performance-Ressourcen-Timing-Puffer voll ist. Passen Sie die Größe des Ressourcen-Timing-Puffers mit performance.setResourceTimingBufferSize()
an oder leeren Sie den Puffer mit performance.clearResourceTimings()
im Ereignis-Listener, damit dem Performance-Zeitachsen-Puffer weitere Einträge hinzugefügt werden können.
Klasse: PerformanceEntry
Hinzugefügt in: v8.5.0
Der Konstruktor dieser Klasse ist für Benutzer nicht direkt zugänglich.
performanceEntry.duration
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceEntry -Objekt als Empfänger aufgerufen werden. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
Die Gesamtanzahl der Millisekunden, die für diesen Eintrag verstrichen sind. Dieser Wert ist nicht für alle Performance-Eintragstypen aussagekräftig.
performanceEntry.entryType
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceEntry -Objekt als Empfänger aufgerufen werden. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
Der Typ des Performance-Eintrags. Er kann einer der folgenden sein:
'dns'
(nur Node.js)'function'
(nur Node.js)'gc'
(nur Node.js)'http2'
(nur Node.js)'http'
(nur Node.js)'mark'
(verfügbar im Web)'measure'
(verfügbar im Web)'net'
(nur Node.js)'node'
(nur Node.js)'resource'
(verfügbar im Web)
performanceEntry.name
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceEntry -Objekt als Empfänger aufgerufen werden. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
Der Name des Performance-Eintrags.
performanceEntry.startTime
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceEntry -Objekt als Empfänger aufgerufen werden. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
Der hochauflösende Millisekunden-Zeitstempel, der den Startzeitpunkt des Performance-Eintrags markiert.
Klasse: PerformanceMark
Hinzugefügt in: v18.2.0, v16.17.0
- Erweitert: <PerformanceEntry>
Stellt Markierungen bereit, die mit der Methode Performance.mark()
erstellt wurden.
performanceMark.detail
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceMark -Objekt als Empfänger aufgerufen werden. |
v16.0.0 | Hinzugefügt in: v16.0.0 |
Zusätzliche Details, die bei der Erstellung mit der Methode Performance.mark()
angegeben wurden.
Klasse: PerformanceMeasure
Hinzugefügt in: v18.2.0, v16.17.0
- Erweitert: <PerformanceEntry>
Stellt Messungen bereit, die mit der Methode Performance.measure()
erstellt wurden.
Der Konstruktor dieser Klasse wird Benutzern nicht direkt zugänglich gemacht.
performanceMeasure.detail
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceMeasure -Objekt als Empfänger aufgerufen werden. |
v16.0.0 | Hinzugefügt in: v16.0.0 |
Zusätzliche Details, die bei der Erstellung mit der Methode Performance.measure()
angegeben wurden.
Klasse: PerformanceNodeEntry
Hinzugefügt in: v19.0.0
- Erweitert: <PerformanceEntry>
Diese Klasse ist eine Erweiterung von Node.js. Sie ist in Webbrowsern nicht verfügbar.
Bietet detaillierte Node.js-Timingdaten.
Der Konstruktor dieser Klasse wird Benutzern nicht direkt zugänglich gemacht.
performanceNodeEntry.detail
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Eigenschafts-Getter muss mit dem PerformanceNodeEntry -Objekt als Empfänger aufgerufen werden. |
v16.0.0 | Hinzugefügt in: v16.0.0 |
Zusätzliche Details spezifisch für den entryType
.
performanceNodeEntry.flags
[Verlauf]
Version | Änderungen |
---|---|
v16.0.0 | Laufzeit-veraltet. Jetzt in die Detail-Eigenschaft verschoben, wenn entryType 'gc' ist. |
v13.9.0, v12.17.0 | Hinzugefügt in: v13.9.0, v12.17.0 |
[Stabil: 0 - Veraltet]
Stabil: 0 Stabilität: 0 - Veraltet: Verwenden Sie stattdessen performanceNodeEntry.detail
.
Wenn performanceEntry.entryType
gleich 'gc'
ist, enthält die performance.flags
-Eigenschaft zusätzliche Informationen über den Garbage-Collection-Vorgang. Der Wert kann einer der folgenden sein:
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NO
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCED
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE
performanceNodeEntry.kind
[Verlauf]
Version | Änderungen |
---|---|
v16.0.0 | Laufzeit-veraltet. Jetzt in die Detail-Eigenschaft verschoben, wenn entryType 'gc' ist. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
[Stabil: 0 - Veraltet]
Stabil: 0 Stabilität: 0 - Veraltet: Verwenden Sie stattdessen performanceNodeEntry.detail
.
Wenn performanceEntry.entryType
gleich 'gc'
ist, identifiziert die performance.kind
-Eigenschaft den Typ des aufgetretenen Garbage-Collection-Vorgangs. Der Wert kann einer der folgenden sein:
perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR
perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR
perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL
perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
Details zur Garbage Collection ('gc')
Wenn performanceEntry.type
gleich 'gc'
ist, ist die Eigenschaft performanceNodeEntry.detail
ein <Object> mit zwei Eigenschaften:
kind
<number> Einer von:perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR
perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR
perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL
perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
flags
<number> Einer von:perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NO
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCED
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE
Details zu HTTP ('http')
Wenn performanceEntry.type
gleich 'http'
ist, ist die Eigenschaft performanceNodeEntry.detail
ein <Object>, das zusätzliche Informationen enthält.
Wenn performanceEntry.name
gleich HttpClient
ist, enthält detail
die folgenden Eigenschaften: req
, res
. Die Eigenschaft req
ist ein <Object> mit method
, url
, headers
. Die Eigenschaft res
ist ein <Object> mit statusCode
, statusMessage
, headers
.
Wenn performanceEntry.name
gleich HttpRequest
ist, enthält detail
die folgenden Eigenschaften: req
, res
. Die Eigenschaft req
ist ein <Object> mit method
, url
, headers
. Die Eigenschaft res
ist ein <Object> mit statusCode
, statusMessage
, headers
.
Dies kann zusätzlichen Speicheroverhead verursachen und sollte standardmäßig nur zu Diagnosezwecken verwendet und nicht in der Produktion aktiviert bleiben.
HTTP/2 ('http2') Details
Wenn performanceEntry.type
gleich 'http2'
ist, ist die Eigenschaft performanceNodeEntry.detail
ein <Object>, das zusätzliche Leistungsinformationen enthält.
Wenn performanceEntry.name
gleich Http2Stream
ist, enthält detail
die folgenden Eigenschaften:
bytesRead
<number> Die Anzahl der für diesenHttp2Stream
empfangenenDATA
-Frame-Bytes.bytesWritten
<number> Die Anzahl der für diesenHttp2Stream
gesendetenDATA
-Frame-Bytes.id
<number> Die Kennung des zugehörigenHttp2Stream
timeToFirstByte
<number> Die Anzahl der Millisekunden, die zwischen derstartTime
desPerformanceEntry
und dem Empfang des erstenDATA
-Frames verstrichen sind.timeToFirstByteSent
<number> Die Anzahl der Millisekunden, die zwischen derstartTime
desPerformanceEntry
und dem Senden des erstenDATA
-Frames verstrichen sind.timeToFirstHeader
<number> Die Anzahl der Millisekunden, die zwischen derstartTime
desPerformanceEntry
und dem Empfang des ersten Headers verstrichen sind.
Wenn performanceEntry.name
gleich Http2Session
ist, enthält detail
die folgenden Eigenschaften:
bytesRead
<number> Die Anzahl der für dieseHttp2Session
empfangenen Bytes.bytesWritten
<number> Die Anzahl der für dieseHttp2Session
gesendeten Bytes.framesReceived
<number> Die Anzahl der von derHttp2Session
empfangenen HTTP/2-Frames.framesSent
<number> Die Anzahl der von derHttp2Session
gesendeten HTTP/2-Frames.maxConcurrentStreams
<number> Die maximale Anzahl von Streams, die während der Lebensdauer derHttp2Session
gleichzeitig geöffnet sind.pingRTT
<number> Die Anzahl der Millisekunden, die seit der Übertragung einesPING
-Frames und dem Empfang seiner Bestätigung verstrichen sind. Nur vorhanden, wenn einPING
-Frame auf derHttp2Session
gesendet wurde.streamAverageDuration
<number> Die durchschnittliche Dauer (in Millisekunden) für alleHttp2Stream
-Instanzen.streamCount
<number> Die Anzahl der von derHttp2Session
verarbeitetenHttp2Stream
-Instanzen.type
<string> Entweder'server'
oder'client'
, um den Typ derHttp2Session
zu identifizieren.
Timerify ('function') Details
Wenn performanceEntry.type
gleich 'function'
ist, ist die Eigenschaft performanceNodeEntry.detail
ein <Array>, das die Eingabeargumente der zeitgesteuerten Funktion auflistet.
Net ('net') Details
Wenn performanceEntry.type
gleich 'net'
ist, ist die Eigenschaft performanceNodeEntry.detail
ein <Object>, das zusätzliche Informationen enthält.
Wenn performanceEntry.name
gleich connect
ist, enthält detail
die folgenden Eigenschaften: host
, port
.
DNS ('dns') Details
Wenn performanceEntry.type
gleich 'dns'
ist, ist die Eigenschaft performanceNodeEntry.detail
ein <Object>, das zusätzliche Informationen enthält.
Wenn performanceEntry.name
gleich lookup
ist, enthält detail
die folgenden Eigenschaften: hostname
, family
, hints
, verbatim
, addresses
.
Wenn performanceEntry.name
gleich lookupService
ist, enthält detail
die folgenden Eigenschaften: host
, port
, hostname
, service
.
Wenn performanceEntry.name
gleich queryxxx
oder getHostByAddr
ist, enthält detail
die folgenden Eigenschaften: host
, ttl
, result
. Der Wert von result
ist der gleiche wie das Ergebnis von queryxxx
oder getHostByAddr
.
Klasse: PerformanceNodeTiming
Hinzugefügt in: v8.5.0
- Erweitert: <PerformanceEntry>
Diese Eigenschaft ist eine Erweiterung von Node.js. Sie ist in Webbrowsern nicht verfügbar.
Bietet Zeitdetails für Node.js selbst. Der Konstruktor dieser Klasse ist für Benutzer nicht zugänglich.
performanceNodeTiming.bootstrapComplete
Hinzugefügt in: v8.5.0
Der hochauflösende Millisekunden-Zeitstempel, zu dem der Node.js-Prozess das Bootstrapping abgeschlossen hat. Wenn das Bootstrapping noch nicht abgeschlossen ist, hat die Eigenschaft den Wert -1.
performanceNodeTiming.environment
Hinzugefügt in: v8.5.0
Der hochauflösende Millisekunden-Zeitstempel, zu dem die Node.js-Umgebung initialisiert wurde.
performanceNodeTiming.idleTime
Hinzugefügt in: v14.10.0, v12.19.0
Der hochauflösende Millisekunden-Zeitstempel der Zeitdauer, die die Ereignisschleife innerhalb des Ereignisproviders der Ereignisschleife (z. B. epoll_wait
) im Leerlauf war. Die CPU-Auslastung wird hierbei nicht berücksichtigt. Wenn die Ereignisschleife noch nicht gestartet wurde (z. B. im ersten Tick des Hauptskripts), hat die Eigenschaft den Wert 0.
performanceNodeTiming.loopExit
Hinzugefügt in: v8.5.0
Der hochauflösende Millisekunden-Zeitstempel, zu dem die Node.js-Ereignisschleife beendet wurde. Wenn die Ereignisschleife noch nicht beendet wurde, hat die Eigenschaft den Wert -1. Sie kann nur einen Wert ungleich -1 in einem Handler des 'exit'
-Ereignisses haben.
performanceNodeTiming.loopStart
Hinzugefügt in: v8.5.0
Der hochauflösende Millisekunden-Zeitstempel, zu dem die Node.js-Ereignisschleife gestartet wurde. Wenn die Ereignisschleife noch nicht gestartet wurde (z. B. im ersten Tick des Hauptskripts), hat die Eigenschaft den Wert -1.
performanceNodeTiming.nodeStart
Hinzugefügt in: v8.5.0
Der hochauflösende Millisekunden-Zeitstempel, zu dem der Node.js-Prozess initialisiert wurde.
performanceNodeTiming.uvMetricsInfo
Hinzugefügt in: v22.8.0, v20.18.0
- Gibt zurück: <Object>
Dies ist ein Wrapper für die Funktion uv_metrics_info
. Er gibt den aktuellen Satz von Ereignisschleifenmetriken zurück.
Es wird empfohlen, diese Eigenschaft innerhalb einer Funktion zu verwenden, deren Ausführung mit setImmediate
geplant wurde, um zu vermeiden, dass Metriken erfasst werden, bevor alle während der aktuellen Schleifeniteration geplanten Operationen abgeschlossen sind.
const { performance } = require('node:perf_hooks')
setImmediate(() => {
console.log(performance.nodeTiming.uvMetricsInfo)
})
import { performance } from 'node:perf_hooks'
setImmediate(() => {
console.log(performance.nodeTiming.uvMetricsInfo)
})
performanceNodeTiming.v8Start
Hinzugefügt in: v8.5.0
Der hochauflösende Millisekunden-Zeitstempel, zu dem die V8-Plattform initialisiert wurde.
Klasse: PerformanceResourceTiming
Hinzugefügt in: v18.2.0, v16.17.0
- Erweitert: <PerformanceEntry>
Bietet detaillierte Netzwerkzeitdaten bezüglich des Ladens der Ressourcen einer Anwendung.
Der Konstruktor dieser Klasse ist Benutzern nicht direkt zugänglich.
performanceResourceTiming.workerStart
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, unmittelbar bevor die fetch
-Anfrage gesendet wird. Wenn die Ressource nicht von einem Worker abgefangen wird, gibt die Eigenschaft immer 0 zurück.
performanceResourceTiming.redirectStart
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, der die Startzeit des Abrufs darstellt, der die Weiterleitung initiiert.
performanceResourceTiming.redirectEnd
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, der unmittelbar nach dem Empfang des letzten Bytes der Antwort der letzten Weiterleitung erstellt wird.
performanceResourceTiming.fetchStart
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel unmittelbar bevor Node.js mit dem Abrufen der Ressource beginnt.
performanceResourceTiming.domainLookupStart
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel unmittelbar bevor Node.js mit der Domainnamenauflösung für die Ressource beginnt.
performanceResourceTiming.domainLookupEnd
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, der den Zeitpunkt unmittelbar nach dem Abschluss der Domainnamenauflösung für die Ressource durch Node.js darstellt.
performanceResourceTiming.connectStart
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, der den Zeitpunkt unmittelbar bevor Node.js mit dem Aufbau der Verbindung zum Server beginnt, um die Ressource abzurufen, darstellt.
performanceResourceTiming.connectEnd
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, der den Zeitpunkt unmittelbar nach dem Abschluss der Verbindungsherstellung von Node.js zum Server zum Abrufen der Ressource darstellt.
performanceResourceTiming.secureConnectionStart
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, der den Zeitpunkt unmittelbar vor dem Start des Handshake-Prozesses von Node.js zur Sicherung der aktuellen Verbindung darstellt.
performanceResourceTiming.requestStart
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, der den Zeitpunkt unmittelbar vor dem Empfang des ersten Bytes der Antwort vom Server durch Node.js darstellt.
performanceResourceTiming.responseEnd
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Der hochauflösende Millisekunden-Zeitstempel, der den Zeitpunkt unmittelbar nach dem Empfang des letzten Bytes der Ressource durch Node.js oder unmittelbar vor dem Schließen der Transportverbindung darstellt, je nachdem, was zuerst eintritt.
performanceResourceTiming.transferSize
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Eine Zahl, die die Größe (in Oktetten) der abgerufenen Ressource darstellt. Die Größe umfasst die Antwortheader-Felder plus den Antwort-Payload-Body.
performanceResourceTiming.encodedBodySize
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Eine Zahl, die die Größe (in Oktetten) des aus dem Fetch (HTTP oder Cache) empfangenen Payload-Bodys darstellt, bevor jegliche angewendete Content-Codierungen entfernt werden.
performanceResourceTiming.decodedBodySize
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Dieser Property-Getter muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Eine Zahl, die die Größe (in Oktetten) des aus dem Fetch (HTTP oder Cache) empfangenen Nachrichtenkörpers darstellt, nachdem jegliche angewendete Content-Codierungen entfernt wurden.
performanceResourceTiming.toJSON()
[Verlauf]
Version | Änderungen |
---|---|
v19.0.0 | Diese Methode muss mit dem PerformanceResourceTiming -Objekt als Empfänger aufgerufen werden. |
v18.2.0, v16.17.0 | Hinzugefügt in: v18.2.0, v16.17.0 |
Gibt ein object
zurück, das die JSON-Darstellung des PerformanceResourceTiming
-Objekts ist.
Klasse: PerformanceObserver
Hinzugefügt in: v8.5.0
PerformanceObserver.supportedEntryTypes
Hinzugefügt in: v16.0.0
Ruft unterstützte Typen ab.
new PerformanceObserver(callback)
[Historie]
Version | Änderungen |
---|---|
v18.0.0 | Das Übergeben einer ungültigen Callback-Funktion an das callback -Argument wirft jetzt ERR_INVALID_ARG_TYPE anstelle von ERR_INVALID_CALLBACK . |
v8.5.0 | Hinzugefügt in: v8.5.0 |
callback
<Funktion>list
<PerformanceObserverEntryList>observer
<PerformanceObserver>
PerformanceObserver
-Objekte stellen Benachrichtigungen bereit, wenn der Performance Timeline neue PerformanceEntry
-Instanzen hinzugefügt wurden.
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries())
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark'], buffered: true })
performance.mark('test')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries())
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark'], buffered: true })
performance.mark('test')
Da PerformanceObserver
-Instanzen ihren eigenen zusätzlichen Performance-Overhead verursachen, sollten Instanzen nicht auf unbestimmte Zeit für Benachrichtigungen abonniert bleiben. Benutzer sollten Observer trennen, sobald sie nicht mehr benötigt werden.
Die callback
-Funktion wird aufgerufen, wenn ein PerformanceObserver
über neue PerformanceEntry
-Instanzen benachrichtigt wird. Die Callback-Funktion empfängt eine PerformanceObserverEntryList
-Instanz und eine Referenz auf den PerformanceObserver
.
performanceObserver.disconnect()
Hinzugefügt in: v8.5.0
Trennt die PerformanceObserver
-Instanz von allen Benachrichtigungen.
performanceObserver.observe(options)
[Geschichte]
Version | Änderungen |
---|---|
v16.7.0 | Aktualisiert, um dem Performance Timeline Level 2 zu entsprechen. Die Option buffered wurde wieder hinzugefügt. |
v16.0.0 | Aktualisiert, um dem User Timing Level 3 zu entsprechen. Die Option buffered wurde entfernt. |
v8.5.0 | Hinzugefügt in: v8.5.0 |
options
<Object>type
<string> Ein einzelner <PerformanceEntry>-Typ. Darf nicht angegeben werden, wennentryTypes
bereits angegeben wurde.entryTypes
<string[]> Ein Array von Strings, das die Typen von <PerformanceEntry>-Instanzen identifiziert, an denen der Beobachter interessiert ist. Wenn nicht angegeben, wird ein Fehler ausgelöst.buffered
<boolean> Wenntrue
, wird der Beobachter-Callback mit einer Liste globaler, gepufferterPerformanceEntry
-Einträge aufgerufen. Wennfalse
, werden nurPerformanceEntry
s, die nach dem Zeitpunkt erstellt wurden, an den Beobachter-Callback gesendet. Standard:false
.
Abonniert die <PerformanceObserver>-Instanz für Benachrichtigungen über neue <PerformanceEntry>-Instanzen, die entweder durch options.entryTypes
oder options.type
identifiziert werden:
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((list, observer) => {
// Wird einmal asynchron aufgerufen. `list` enthält drei Elemente.
})
obs.observe({ type: 'mark' })
for (let n = 0; n < 3; n++) performance.mark(`test${n}`)
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((list, observer) => {
// Wird einmal asynchron aufgerufen. `list` enthält drei Elemente.
})
obs.observe({ type: 'mark' })
for (let n = 0; n < 3; n++) performance.mark(`test${n}`)
performanceObserver.takeRecords()
Hinzugefügt in: v16.0.0
- Gibt zurück: <PerformanceEntry[]> Aktuelle Liste der im Performance-Observer gespeicherten Einträge, die diese leert.
Klasse: PerformanceObserverEntryList
Hinzugefügt in: v8.5.0
Die Klasse PerformanceObserverEntryList
wird verwendet, um Zugriff auf die PerformanceEntry
-Instanzen zu gewähren, die an einen PerformanceObserver
übergeben werden. Der Konstruktor dieser Klasse ist für Benutzer nicht zugänglich.
performanceObserverEntryList.getEntries()
Hinzugefügt in: v8.5.0
- Gibt zurück: <PerformanceEntry[]>
Gibt eine Liste von PerformanceEntry
-Objekten in chronologischer Reihenfolge in Bezug auf performanceEntry.startTime
zurück.
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntries())
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 81.465639,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 81.860064,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntries())
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 81.465639,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 81.860064,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
performanceObserverEntryList.getEntriesByName(name[, type])
Hinzugefügt in: v8.5.0
name
<string>type
<string>- Gibt zurück: <PerformanceEntry[]>
Gibt eine Liste von PerformanceEntry
-Objekten in chronologischer Reihenfolge in Bezug auf performanceEntry.startTime
zurück, deren performanceEntry.name
gleich name
ist und optional, deren performanceEntry.entryType
gleich type
ist.
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByName('meow'))
/**
* [
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 98.545991,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('nope')) // []
console.log(perfObserverList.getEntriesByName('test', 'mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 63.518931,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('test', 'measure')) // []
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark', 'measure'] })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByName('meow'))
/**
* [
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 98.545991,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('nope')) // []
console.log(perfObserverList.getEntriesByName('test', 'mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 63.518931,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('test', 'measure')) // []
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark', 'measure'] })
performance.mark('test')
performance.mark('meow')
performanceObserverEntryList.getEntriesByType(type)
Hinzugefügt in: v8.5.0
type
<string>- Gibt zurück: <PerformanceEntry[]>
Gibt eine Liste von PerformanceEntry
-Objekten in chronologischer Reihenfolge in Bezug auf performanceEntry.startTime
zurück, deren performanceEntry.entryType
gleich type
ist.
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByType('mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 55.897834,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 56.350146,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByType('mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 55.897834,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 56.350146,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
perf_hooks.createHistogram([options])
Hinzugefügt in: v15.9.0, v14.18.0
options
<Object>lowest
<number> | <bigint> Der niedrigste erkennbare Wert. Muss ein ganzzahliger Wert größer als 0 sein. Standard:1
.highest
<number> | <bigint> Der höchste aufzeichenbare Wert. Muss ein ganzzahliger Wert sein, der gleich oder größer als das Doppelte vonlowest
ist. Standard:Number.MAX_SAFE_INTEGER
.figures
<number> Die Anzahl der Genauigkeitsstellen. Muss eine Zahl zwischen1
und5
sein. Standard:3
.
- Gibt zurück: <RecordableHistogram>
Gibt ein <RecordableHistogram> zurück.
perf_hooks.monitorEventLoopDelay([options])
Hinzugefügt in: v11.10.0
options
<Object>resolution
<number> Die Abtastrate in Millisekunden. Muss größer als Null sein. Standard:10
.
Gibt zurück: <IntervalHistogram>
Diese Eigenschaft ist eine Erweiterung von Node.js. Sie ist in Webbrowsern nicht verfügbar.
Erstellt ein IntervalHistogram
-Objekt, das die Event-Loop-Verzögerung über die Zeit abtastet und meldet. Die Verzögerungen werden in Nanosekunden gemeldet.
Die Verwendung eines Timers zur Erkennung der ungefähren Event-Loop-Verzögerung funktioniert, da die Ausführung von Timern speziell an den Lebenszyklus der libuv-Event-Loop gebunden ist. Das heißt, eine Verzögerung in der Loop verursacht eine Verzögerung in der Ausführung des Timers, und genau diese Verzögerungen sollen mit dieser API erkannt werden.
import { monitorEventLoopDelay } from 'node:perf_hooks'
const h = monitorEventLoopDelay({ resolution: 20 })
h.enable()
// Irgendetwas tun.
h.disable()
console.log(h.min)
console.log(h.max)
console.log(h.mean)
console.log(h.stddev)
console.log(h.percentiles)
console.log(h.percentile(50))
console.log(h.percentile(99))
const { monitorEventLoopDelay } = require('node:perf_hooks')
const h = monitorEventLoopDelay({ resolution: 20 })
h.enable()
// Irgendetwas tun.
h.disable()
console.log(h.min)
console.log(h.max)
console.log(h.mean)
console.log(h.stddev)
console.log(h.percentiles)
console.log(h.percentile(50))
console.log(h.percentile(99))
Klasse: Histogram
Hinzugefügt in: v11.10.0
histogram.count
Hinzugefügt in: v17.4.0, v16.14.0
Die Anzahl der vom Histogramm aufgezeichneten Stichproben.
histogram.countBigInt
Hinzugefügt in: v17.4.0, v16.14.0
Die Anzahl der vom Histogramm aufgezeichneten Stichproben.
histogram.exceeds
Hinzugefügt in: v11.10.0
Die Anzahl, wie oft die Ereignisschleifenverzögerung den maximalen Schwellenwert von 1 Stunde überschritten hat.
histogram.exceedsBigInt
Hinzugefügt in: v17.4.0, v16.14.0
Die Anzahl, wie oft die Ereignisschleifenverzögerung den maximalen Schwellenwert von 1 Stunde überschritten hat.
histogram.max
Hinzugefügt in: v11.10.0
Die maximale aufgezeichnete Ereignisschleifenverzögerung.
histogram.maxBigInt
Hinzugefügt in: v17.4.0, v16.14.0
Die maximale aufgezeichnete Ereignisschleifenverzögerung.
histogram.mean
Hinzugefügt in: v11.10.0
Der Mittelwert der aufgezeichneten Ereignisschleifenverzögerungen.
histogram.min
Hinzugefügt in: v11.10.0
Die minimale aufgezeichnete Ereignisschleifenverzögerung.
histogram.minBigInt
Hinzugefügt in: v17.4.0, v16.14.0
Die minimale aufgezeichnete Ereignisschleifenverzögerung.
histogram.percentile(percentile)
Hinzugefügt in: v11.10.0
Gibt den Wert am angegebenen Perzentil zurück.
histogram.percentileBigInt(percentile)
Hinzugefügt in: v17.4.0, v16.14.0
Gibt den Wert am angegebenen Perzentil zurück.
histogram.percentiles
Hinzugefügt in: v11.10.0
Gibt ein Map
-Objekt zurück, das die kumulierte Perzentilverteilung detailliert beschreibt.
histogram.percentilesBigInt
Hinzugefügt in: v17.4.0, v16.14.0
Gibt ein Map
-Objekt zurück, das die kumulierte Perzentilverteilung detailliert beschreibt.
histogram.reset()
Hinzugefügt in: v11.10.0
Setzt die gesammelten Histogrammdaten zurück.
histogram.stddev
Hinzugefügt in: v11.10.0
Die Standardabweichung der aufgezeichneten Event-Loop-Verzögerungen.
Klasse: IntervalHistogram extends Histogram
Ein Histogram
, das periodisch in einem gegebenen Intervall aktualisiert wird.
histogram.disable()
Hinzugefügt in: v11.10.0
- Gibt zurück: <boolean>
Deaktiviert den Timer für das Aktualisierungsintervall. Gibt true
zurück, wenn der Timer angehalten wurde, false
, wenn er bereits angehalten war.
histogram.enable()
Hinzugefügt in: v11.10.0
- Gibt zurück: <boolean>
Aktiviert den Timer für das Aktualisierungsintervall. Gibt true
zurück, wenn der Timer gestartet wurde, false
, wenn er bereits gestartet war.
Klonen eines IntervalHistogram
<IntervalHistogram>-Instanzen können über <MessagePort> geklont werden. Auf der Empfangsseite wird das Histogramm als einfaches <Histogram>-Objekt geklont, das die Methoden enable()
und disable()
nicht implementiert.
Klasse: RecordableHistogram extends Histogram
Hinzugefügt in: v15.9.0, v14.18.0
histogram.add(other)
Hinzugefügt in: v17.4.0, v16.14.0
other
<RecordableHistogram>
Fügt die Werte von other
zu diesem Histogramm hinzu.
histogram.record(val)
Hinzugefügt in: v15.9.0, v14.18.0
histogram.recordDelta()
Hinzugefügt in: v15.9.0, v14.18.0
Berechnet die Zeitdauer (in Nanosekunden), die seit dem vorherigen Aufruf von recordDelta()
vergangen ist, und zeichnet diesen Betrag im Histogramm auf.
Beispiele
Messen der Dauer von asynchronen Operationen
Das folgende Beispiel verwendet die Async Hooks und Performance APIs, um die tatsächliche Dauer einer Timeout-Operation zu messen (einschließlich der Zeit, die zur Ausführung des Callbacks benötigt wurde).
import { createHook } from 'node:async_hooks'
import { performance, PerformanceObserver } from 'node:perf_hooks'
const set = new Set()
const hook = createHook({
init(id, type) {
if (type === 'Timeout') {
performance.mark(`Timeout-${id}-Init`)
set.add(id)
}
},
destroy(id) {
if (set.has(id)) {
set.delete(id)
performance.mark(`Timeout-${id}-Destroy`)
performance.measure(`Timeout-${id}`, `Timeout-${id}-Init`, `Timeout-${id}-Destroy`)
}
},
})
hook.enable()
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries()[0])
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['measure'], buffered: true })
setTimeout(() => {}, 1000)
'use strict'
const async_hooks = require('node:async_hooks')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const set = new Set()
const hook = async_hooks.createHook({
init(id, type) {
if (type === 'Timeout') {
performance.mark(`Timeout-${id}-Init`)
set.add(id)
}
},
destroy(id) {
if (set.has(id)) {
set.delete(id)
performance.mark(`Timeout-${id}-Destroy`)
performance.measure(`Timeout-${id}`, `Timeout-${id}-Init`, `Timeout-${id}-Destroy`)
}
},
})
hook.enable()
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries()[0])
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['measure'], buffered: true })
setTimeout(() => {}, 1000)
Messen, wie lange das Laden von Abhängigkeiten dauert
Das folgende Beispiel misst die Dauer von require()
-Operationen zum Laden von Abhängigkeiten:
import { performance, PerformanceObserver } from 'node:perf_hooks'
// Aktiviert den Observer
const obs = new PerformanceObserver(list => {
const entries = list.getEntries()
entries.forEach(entry => {
console.log(`import('${entry[0]}')`, entry.duration)
})
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'], buffered: true })
const timedImport = performance.timerify(async module => {
return await import(module)
})
await timedImport('some-module')
'use strict'
const { performance, PerformanceObserver } = require('node:perf_hooks')
const mod = require('node:module')
// Monkey-Patch für die require-Funktion
mod.Module.prototype.require = performance.timerify(mod.Module.prototype.require)
require = performance.timerify(require)
// Aktiviert den Observer
const obs = new PerformanceObserver(list => {
const entries = list.getEntries()
entries.forEach(entry => {
console.log(`require('${entry[0]}')`, entry.duration)
})
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'], buffered: true })
require('some-module')
Messen, wie lange ein HTTP-Round-Trip dauert
Das folgende Beispiel wird verwendet, um die Zeit zu verfolgen, die von HTTP-Client (OutgoingMessage
) und HTTP-Anfrage (IncomingMessage
) aufgewendet wird. Für den HTTP-Client bedeutet dies das Zeitintervall zwischen dem Start der Anfrage und dem Empfang der Antwort, und für die HTTP-Anfrage bedeutet dies das Zeitintervall zwischen dem Empfang der Anfrage und dem Senden der Antwort:
import { PerformanceObserver } from 'node:perf_hooks'
import { createServer, get } from 'node:http'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['http'] })
const PORT = 8080
createServer((req, res) => {
res.end('ok')
}).listen(PORT, () => {
get(`http://127.0.0.1:${PORT}`)
})
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const http = require('node:http')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['http'] })
const PORT = 8080
http
.createServer((req, res) => {
res.end('ok')
})
.listen(PORT, () => {
http.get(`http://127.0.0.1:${PORT}`)
})
Messen der Dauer von net.connect
(nur für TCP) bei erfolgreicher Verbindung
import { PerformanceObserver } from 'node:perf_hooks'
import { connect, createServer } from 'node:net'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['net'] })
const PORT = 8080
createServer(socket => {
socket.destroy()
}).listen(PORT, () => {
connect(PORT)
})
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const net = require('node:net')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['net'] })
const PORT = 8080
net
.createServer(socket => {
socket.destroy()
})
.listen(PORT, () => {
net.connect(PORT)
})
Messen der Dauer der DNS-Auflösung bei erfolgreicher Anfrage
import { PerformanceObserver } from 'node:perf_hooks'
import { lookup, promises } from 'node:dns'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['dns'] })
lookup('localhost', () => {})
promises.resolve('localhost')
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const dns = require('node:dns')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['dns'] })
dns.lookup('localhost', () => {})
dns.promises.resolve('localhost')