Skip to content

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:

js
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')
})
js
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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v8.5.0Hinzugefügt in: v8.5.0

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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v16.7.0Hinzugefügt in: v16.7.0

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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefügt in: v18.2.0, v16.17.0

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 von eventLoopUtilization().
  • utilization2 <Object> Das Ergebnis eines vorherigen Aufrufs von eventLoopUtilization() vor utilization1.
  • 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.

js
import { eventLoopUtilization } from 'node:perf_hooks'
import { spawnSync } from 'node:child_process'

setImmediate(() => {
  const elu = eventLoopUtilization()
  spawnSync('sleep', ['5'])
  console.log(eventLoopUtilization(elu).utilization)
})
js
'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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v16.7.0Hinzugefügt in: v16.7.0

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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v16.7.0Hinzugefügt in: v16.7.0

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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v16.7.0Hinzugefügt in: v16.7.0

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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden. Das Argument name ist nicht mehr optional.
v16.0.0Aktualisiert, um der User Timing Level 3-Spezifikation zu entsprechen.
v8.5.0Hinzugefügt in: v8.5.0
  • name <string>
  • options <Object>
    • detail <any> Zusätzliche optionale Details, die mit der Markierung aufgenommen werden sollen.
    • startTime <number> Ein optionaler Zeitstempel, der als Markierungszeit verwendet werden soll. Standard: performance.now().

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.0Argumente bodyInfo, responseStatus und deliveryType hinzugefügt.
v18.2.0, v16.17.0Hinzugefügt in: v18.2.0, v16.17.0

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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v16.0.0Aktualisiert, um der User Timing Level 3-Spezifikation zu entsprechen.
v13.13.0, v12.16.3Parameter startMark und endMark optional gemacht.
v8.5.0Hinzugefü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, wenn startMarkOrOptions 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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v8.5.0Hinzugefügt in: v8.5.0

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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v18.8.0Hinzugefü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.0Die Histogramm-Option wurde hinzugefügt.
v16.0.0Neu implementiert zur Verwendung von reinem JavaScript und zur Möglichkeit, asynchrone Funktionen zu zeitgesteuern.
v8.5.0Hinzugefügt in: v8.5.0

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.

js
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()
js
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.0Diese Methode muss mit dem performance-Objekt als Empfänger aufgerufen werden.
v16.1.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceEntry-Objekt als Empfänger aufgerufen werden.
v8.5.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceEntry-Objekt als Empfänger aufgerufen werden.
v8.5.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceEntry-Objekt als Empfänger aufgerufen werden.
v8.5.0Hinzugefügt in: v8.5.0

Der Name des Performance-Eintrags.

performanceEntry.startTime

[Verlauf]

VersionÄnderungen
v19.0.0Dieser Property-Getter muss mit dem PerformanceEntry-Objekt als Empfänger aufgerufen werden.
v8.5.0Hinzugefü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

Stellt Markierungen bereit, die mit der Methode Performance.mark() erstellt wurden.

performanceMark.detail

[Verlauf]

VersionÄnderungen
v19.0.0Dieser Property-Getter muss mit dem PerformanceMark-Objekt als Empfänger aufgerufen werden.
v16.0.0Hinzugefü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

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.0Dieser Property-Getter muss mit dem PerformanceMeasure-Objekt als Empfänger aufgerufen werden.
v16.0.0Hinzugefü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

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.0Dieser Eigenschafts-Getter muss mit dem PerformanceNodeEntry-Objekt als Empfänger aufgerufen werden.
v16.0.0Hinzugefügt in: v16.0.0

Zusätzliche Details spezifisch für den entryType.

performanceNodeEntry.flags

[Verlauf]

VersionÄnderungen
v16.0.0Laufzeit-veraltet. Jetzt in die Detail-Eigenschaft verschoben, wenn entryType 'gc' ist.
v13.9.0, v12.17.0Hinzugefü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.0Laufzeit-veraltet. Jetzt in die Detail-Eigenschaft verschoben, wenn entryType 'gc' ist.
v8.5.0Hinzugefü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 diesen Http2Stream empfangenen DATA-Frame-Bytes.
  • bytesWritten <number> Die Anzahl der für diesen Http2Stream gesendeten DATA-Frame-Bytes.
  • id <number> Die Kennung des zugehörigen Http2Stream
  • timeToFirstByte <number> Die Anzahl der Millisekunden, die zwischen der startTime des PerformanceEntry und dem Empfang des ersten DATA-Frames verstrichen sind.
  • timeToFirstByteSent <number> Die Anzahl der Millisekunden, die zwischen der startTime des PerformanceEntry und dem Senden des ersten DATA-Frames verstrichen sind.
  • timeToFirstHeader <number> Die Anzahl der Millisekunden, die zwischen der startTime des PerformanceEntry 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 diese Http2Session empfangenen Bytes.
  • bytesWritten <number> Die Anzahl der für diese Http2Session gesendeten Bytes.
  • framesReceived <number> Die Anzahl der von der Http2Session empfangenen HTTP/2-Frames.
  • framesSent <number> Die Anzahl der von der Http2Session gesendeten HTTP/2-Frames.
  • maxConcurrentStreams <number> Die maximale Anzahl von Streams, die während der Lebensdauer der Http2Session gleichzeitig geöffnet sind.
  • pingRTT <number> Die Anzahl der Millisekunden, die seit der Übertragung eines PING-Frames und dem Empfang seiner Bestätigung verstrichen sind. Nur vorhanden, wenn ein PING-Frame auf der Http2Session gesendet wurde.
  • streamAverageDuration <number> Die durchschnittliche Dauer (in Millisekunden) für alle Http2Stream-Instanzen.
  • streamCount <number> Die Anzahl der von der Http2Session verarbeiteten Http2Stream-Instanzen.
  • type <string> Entweder 'server' oder 'client', um den Typ der Http2Session 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

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>
    • loopCount <number> Anzahl der Ereignisschleifeniterationen.
    • events <number> Anzahl der Ereignisse, die vom Ereignishandler verarbeitet wurden.
    • eventsWaiting <number> Anzahl der Ereignisse, die auf die Verarbeitung warteten, als der Ereignisprovider aufgerufen wurde.

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.

js
const { performance } = require('node:perf_hooks')

setImmediate(() => {
  console.log(performance.nodeTiming.uvMetricsInfo)
})
js
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

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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Dieser Property-Getter muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Diese Methode muss mit dem PerformanceResourceTiming-Objekt als Empfänger aufgerufen werden.
v18.2.0, v16.17.0Hinzugefü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.0Das Übergeben einer ungültigen Callback-Funktion an das callback-Argument wirft jetzt ERR_INVALID_ARG_TYPE anstelle von ERR_INVALID_CALLBACK.
v8.5.0Hinzugefügt in: v8.5.0

PerformanceObserver-Objekte stellen Benachrichtigungen bereit, wenn der Performance Timeline neue PerformanceEntry-Instanzen hinzugefügt wurden.

js
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')
js
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.0Aktualisiert, um dem Performance Timeline Level 2 zu entsprechen. Die Option buffered wurde wieder hinzugefügt.
v16.0.0Aktualisiert, um dem User Timing Level 3 zu entsprechen. Die Option buffered wurde entfernt.
v8.5.0Hinzugefügt in: v8.5.0
  • options <Object>
    • type <string> Ein einzelner <PerformanceEntry>-Typ. Darf nicht angegeben werden, wenn entryTypes 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> Wenn true, wird der Beobachter-Callback mit einer Liste globaler, gepufferter PerformanceEntry-Einträge aufgerufen. Wenn false, werden nur PerformanceEntrys, 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:

js
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}`)
js
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 eine Liste von PerformanceEntry-Objekten in chronologischer Reihenfolge in Bezug auf performanceEntry.startTime zurück.

js
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')
js
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

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.

js
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')
js
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

Gibt eine Liste von PerformanceEntry-Objekten in chronologischer Reihenfolge in Bezug auf performanceEntry.startTime zurück, deren performanceEntry.entryType gleich type ist.

js
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')
js
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 von lowest ist. Standard: Number.MAX_SAFE_INTEGER.
    • figures <number> Die Anzahl der Genauigkeitsstellen. Muss eine Zahl zwischen 1 und 5 sein. Standard: 3.
  • Gibt zurück: <RecordableHistogram>

Gibt ein <RecordableHistogram> zurück.

perf_hooks.monitorEventLoopDelay([options])

Hinzugefügt in: v11.10.0

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.

js
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))
js
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

  • percentile <number> Ein Perzentilwert im Bereich (0, 100].
  • Gibt zurück: <number>

Gibt den Wert am angegebenen Perzentil zurück.

histogram.percentileBigInt(percentile)

Hinzugefügt in: v17.4.0, v16.14.0

  • percentile <number> Ein Perzentilwert im Bereich (0, 100].
  • Gibt zurück: <bigint>

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

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

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

Fügt die Werte von other zu diesem Histogramm hinzu.

histogram.record(val)

Hinzugefügt in: v15.9.0, v14.18.0

  • val <number> | <bigint> Der Betrag, der im Histogramm aufgezeichnet werden soll.

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).

js
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)
js
'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:

js
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')
js
'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:

js
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}`)
})
js
'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

js
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)
})
js
'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

js
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')
js
'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')