Skip to content

API de mesure des performances

[Stable: 2 - Stable]

Stable: 2 Stabilité: 2 - Stable

Code source : lib/perf_hooks.js

Ce module fournit une implémentation d’un sous-ensemble des API de performance Web du W3C, ainsi que des API supplémentaires pour les mesures de performance spécifiques à Node.js.

Node.js prend en charge les API de performance Web suivantes :

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('Début à maintenant')

performance.mark('A')
doSomeLongRunningProcess(() => {
  performance.measure('De A à maintenant', 'A')

  performance.mark('B')
  performance.measure('De A à 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('Début à maintenant')

performance.mark('A')
;(async function doSomeLongRunningProcess() {
  await new Promise(r => setTimeout(r, 5000))
  performance.measure('De A à maintenant', 'A')

  performance.mark('B')
  performance.measure('De A à B', 'A', 'B')
})()

perf_hooks.performance

Ajouté dans : v8.5.0

Un objet qui peut être utilisé pour collecter des métriques de performance à partir de l’instance Node.js actuelle. Il est similaire à window.performance dans les navigateurs.

performance.clearMarks([name])

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur.
v8.5.0Ajouté dans : v8.5.0

Si name n'est pas fourni, supprime tous les objets PerformanceMark de la chronologie des performances. Si name est fourni, supprime uniquement la marque nommée.

performance.clearMeasures([name])

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur.
v16.7.0Ajouté dans : v16.7.0

Si name n'est pas fourni, supprime tous les objets PerformanceMeasure de la chronologie des performances. Si name est fourni, supprime uniquement la mesure nommée.

performance.clearResourceTimings([name])

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

Si name n'est pas fourni, supprime tous les objets PerformanceResourceTiming de la chronologie des ressources. Si name est fourni, supprime uniquement la ressource nommée.

performance.eventLoopUtilization([utilization1[, utilization2]])

Ajouté dans : v14.10.0, v12.19.0

  • utilization1 <Object> Le résultat d'un appel précédent à eventLoopUtilization().
  • utilization2 <Object> Le résultat d'un appel précédent à eventLoopUtilization() avant utilization1.
  • Retourne : <Object>

La méthode eventLoopUtilization() retourne un objet qui contient la durée cumulée pendant laquelle la boucle d'événements a été à la fois inactive et active sous forme de temporisateur en millisecondes haute résolution. La valeur utilization est l'utilisation de la boucle d'événements (ELU) calculée.

Si l'amorçage n'est pas encore terminé sur le thread principal, les propriétés ont la valeur 0. L'ELU est immédiatement disponible sur les threads de Worker, car l'amorçage se produit dans la boucle d'événements.

Les deux utilization1 et utilization2 sont des paramètres optionnels.

Si utilization1 est passé, alors le delta entre les temps active et idle de l'appel actuel, ainsi que la valeur utilization correspondante sont calculés et retournés (similaire à process.hrtime()).

Si utilization1 et utilization2 sont tous deux passés, alors le delta est calculé entre les deux arguments. Il s'agit d'une option pratique car, contrairement à process.hrtime(), le calcul de l'ELU est plus complexe qu'une simple soustraction.

L'ELU est similaire à l'utilisation du CPU, sauf qu'elle ne mesure que les statistiques de la boucle d'événements et non l'utilisation du CPU. Elle représente le pourcentage de temps que la boucle d'événements a passé en dehors du fournisseur d'événements de la boucle d'événements (par ex. epoll_wait). Aucun autre temps d'inactivité du CPU n'est pris en compte. Voici un exemple de la manière dont un processus principalement inactif aura une ELU élevée.

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

Bien que le CPU soit principalement inactif pendant l'exécution de ce script, la valeur de utilization est 1. Cela est dû au fait que l'appel à child_process.spawnSync() empêche la boucle d'événements de se poursuivre.

Le fait de transmettre un objet défini par l'utilisateur au lieu du résultat d'un appel précédent à eventLoopUtilization() entraînera un comportement indéfini. Il n'est pas garanti que les valeurs de retour reflètent un état correct de la boucle d'événements.

performance.getEntries()

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur.
v16.7.0Ajouté dans : v16.7.0

Retourne une liste d'objets PerformanceEntry dans l'ordre chronologique par rapport à performanceEntry.startTime. Si vous êtes uniquement intéressé par les entrées de performance de certains types ou qui ont certains noms, consultez performance.getEntriesByType() et performance.getEntriesByName().

performance.getEntriesByName(name[, type])

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur.
v16.7.0Ajouté dans : v16.7.0

Retourne une liste d'objets PerformanceEntry dans l'ordre chronologique par rapport à performanceEntry.startTime dont performanceEntry.name est égal à name, et éventuellement, dont performanceEntry.entryType est égal à type.

performance.getEntriesByType(type)

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur.
v16.7.0Ajouté dans : v16.7.0

Retourne une liste d'objets PerformanceEntry dans l'ordre chronologique par rapport à performanceEntry.startTime dont performanceEntry.entryType est égal à type.

performance.mark(name[, options])

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur. L'argument name n'est plus optionnel.
v16.0.0Mis à jour pour se conformer à la spécification User Timing Level 3.
v8.5.0Ajouté dans : v8.5.0
  • name <string>
  • options <Object>
    • detail <any> Détail optionnel supplémentaire à inclure avec la marque.
    • startTime <number> Un horodatage optionnel à utiliser comme heure de la marque. Par défaut : performance.now().

Crée une nouvelle entrée PerformanceMark dans la chronologie des performances. Une PerformanceMark est une sous-classe de PerformanceEntry dont performanceEntry.entryType est toujours 'mark', et dont performanceEntry.duration est toujours 0. Les marques de performance sont utilisées pour marquer des moments significatifs spécifiques dans la chronologie des performances.

L'entrée PerformanceMark créée est placée dans la chronologie globale des performances et peut être interrogée avec performance.getEntries, performance.getEntriesByName et performance.getEntriesByType. Lorsque l'observation est effectuée, les entrées doivent être effacées manuellement de la chronologie globale des performances avec performance.clearMarks.

performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, global, cacheMode, bodyInfo, responseStatus[, deliveryType])

[Historique]

VersionModifications
v22.2.0Ajout des arguments bodyInfo, responseStatus et deliveryType.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

Cette propriété est une extension de Node.js. Elle n’est pas disponible dans les navigateurs Web.

Crée une nouvelle entrée PerformanceResourceTiming dans la chronologie des ressources. Un PerformanceResourceTiming est une sous-classe de PerformanceEntry dont performanceEntry.entryType est toujours 'resource'. Les ressources de performance sont utilisées pour marquer des moments dans la chronologie des ressources.

L’entrée PerformanceMark créée est placée dans la chronologie globale des ressources et peut être interrogée avec performance.getEntries, performance.getEntriesByName et performance.getEntriesByType. Lorsque l’observation est effectuée, les entrées doivent être effacées manuellement de la chronologie globale des performances avec performance.clearResourceTimings.

performance.measure(name[, startMarkOrOptions[, endMark]])

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur.
v16.0.0Mise à jour pour se conformer à la spécification User Timing Level 3.
v13.13.0, v12.16.3Rendre les paramètres startMark et endMark facultatifs.
v8.5.0Ajoutée dans : v8.5.0
  • name <string>

  • startMarkOrOptions <string> | <Object> Facultatif.

    • detail <any> Détail facultatif supplémentaire à inclure avec la mesure.
    • duration <number> Durée entre les heures de début et de fin.
    • end <number> | <string> Horodatage à utiliser comme heure de fin, ou une chaîne identifiant une marque précédemment enregistrée.
    • start <number> | <string> Horodatage à utiliser comme heure de début, ou une chaîne identifiant une marque précédemment enregistrée.
  • endMark <string> Facultatif. Doit être omis si startMarkOrOptions est un <Object>.

Crée une nouvelle entrée PerformanceMeasure dans la chronologie des performances. Un PerformanceMeasure est une sous-classe de PerformanceEntry dont performanceEntry.entryType est toujours 'measure', et dont performanceEntry.duration mesure le nombre de millisecondes écoulées entre startMark et endMark.

L'argument startMark peut identifier n'importe quel PerformanceMark existant dans la chronologie des performances, ou peut identifier n'importe quelle propriété d'horodatage fournie par la classe PerformanceNodeTiming. Si le startMark nommé n'existe pas, une erreur est levée.

L'argument optionnel endMark doit identifier tout PerformanceMark existant dans la chronologie des performances ou toute propriété d'horodatage fournie par la classe PerformanceNodeTiming. endMark sera performance.now() si aucun paramètre n'est passé, sinon, si le endMark nommé n'existe pas, une erreur sera levée.

L'entrée PerformanceMeasure créée est placée dans la chronologie globale des performances et peut être interrogée avec performance.getEntries, performance.getEntriesByName et performance.getEntriesByType. Lorsque l'observation est effectuée, les entrées doivent être effacées manuellement de la chronologie globale des performances avec performance.clearMeasures.

performance.nodeTiming

Ajouté dans : v8.5.0

Cette propriété est une extension de Node.js. Elle n’est pas disponible dans les navigateurs Web.

Une instance de la classe PerformanceNodeTiming qui fournit des mesures de performance pour des étapes opérationnelles spécifiques de Node.js.

performance.now()

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l’objet performance comme récepteur.
v8.5.0Ajouté dans : v8.5.0

Retourne l’horodatage actuel en millisecondes haute résolution, où 0 représente le début du processus node actuel.

performance.setResourceTimingBufferSize(maxSize)

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l’objet performance comme récepteur.
v18.8.0Ajouté dans : v18.8.0

Définit la taille du tampon de synchronisation des ressources de performance globale au nombre spécifié d’objets d’entrée de performance de type « ressource ».

Par défaut, la taille maximale du tampon est définie sur 250.

performance.timeOrigin

Ajouté dans : v8.5.0

La propriété timeOrigin spécifie l’horodatage haute résolution en millisecondes auquel le processus node actuel a commencé, mesuré en heure Unix.

performance.timerify(fn[, options])

[Historique]

VersionModifications
v16.0.0Ajout de l’option histogramme.
v16.0.0Réimplémenté pour utiliser pure-JavaScript et la possibilité de chronométrer les fonctions asynchrones.
v8.5.0Ajouté dans : v8.5.0

Cette propriété est une extension de Node.js. Elle n’est pas disponible dans les navigateurs Web.

Encapsule une fonction dans une nouvelle fonction qui mesure le temps d’exécution de la fonction encapsulée. Un PerformanceObserver doit être abonné au type d’événement 'function' pour que les détails de la synchronisation soient accessibles.

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

// Une entrée de chronologie de performance sera créée
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'] })

// Une entrée de chronologie de performance sera créée
wrapped()

Si la fonction encapsulée retourne une promesse, un gestionnaire final sera attaché à la promesse et la durée sera signalée une fois que le gestionnaire final sera invoqué.

performance.toJSON()

[Historique]

VersionModifications
v19.0.0Cette méthode doit être appelée avec l'objet performance comme récepteur.
v16.1.0Ajouté dans la version : v16.1.0

Un objet qui est la représentation JSON de l'objet performance. Il est similaire à window.performance.toJSON dans les navigateurs.

Événement : 'resourcetimingbufferfull'

Ajouté dans la version : v18.8.0

L'événement 'resourcetimingbufferfull' est déclenché lorsque le tampon global de minutage des ressources de performance est plein. Ajustez la taille du tampon de minutage des ressources avec performance.setResourceTimingBufferSize() ou effacez le tampon avec performance.clearResourceTimings() dans l'écouteur d'événement pour permettre l'ajout de plus d'entrées dans le tampon de la chronologie des performances.

Classe : PerformanceEntry

Ajouté dans la version : v8.5.0

Le constructeur de cette classe n'est pas directement exposé aux utilisateurs.

performanceEntry.duration

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceEntry comme récepteur.
v8.5.0Ajouté dans la version : v8.5.0

Le nombre total de millisecondes écoulées pour cette entrée. Cette valeur n'aura pas de signification pour tous les types d'entrée de performance.

performanceEntry.entryType

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceEntry comme récepteur.
v8.5.0Ajouté dans la version : v8.5.0

Le type d'entrée de performance. Il peut s'agir de l'un des éléments suivants :

  • 'dns' (Node.js uniquement)
  • 'function' (Node.js uniquement)
  • 'gc' (Node.js uniquement)
  • 'http2' (Node.js uniquement)
  • 'http' (Node.js uniquement)
  • 'mark' (disponible sur le Web)
  • 'measure' (disponible sur le Web)
  • 'net' (Node.js uniquement)
  • 'node' (Node.js uniquement)
  • 'resource' (disponible sur le Web)

performanceEntry.name

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceEntry comme receveur.
v8.5.0Ajouté dans : v8.5.0

Le nom de l’entrée de performance.

performanceEntry.startTime

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceEntry comme receveur.
v8.5.0Ajouté dans : v8.5.0

L’horodatage en millisecondes haute résolution marquant le début de l’entrée de performance.

Classe : PerformanceMark

Ajouté dans : v18.2.0, v16.17.0

Expose les marques créées via la méthode Performance.mark().

performanceMark.detail

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceMark comme receveur.
v16.0.0Ajouté dans : v16.0.0

Détail supplémentaire spécifié lors de la création avec la méthode Performance.mark().

Classe : PerformanceMeasure

Ajouté dans : v18.2.0, v16.17.0

Expose les mesures créées via la méthode Performance.measure().

Le constructeur de cette classe n’est pas exposé directement aux utilisateurs.

performanceMeasure.detail

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceMeasure comme receveur.
v16.0.0Ajouté dans : v16.0.0

Détail supplémentaire spécifié lors de la création avec la méthode Performance.measure().

Classe : PerformanceNodeEntry

Ajouté dans : v19.0.0

Cette classe est une extension de Node.js. Elle n’est pas disponible dans les navigateurs Web.

Fournit des données de synchronisation Node.js détaillées.

Le constructeur de cette classe n’est pas directement exposé aux utilisateurs.

performanceNodeEntry.detail

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l’objet PerformanceNodeEntry comme récepteur.
v16.0.0Ajouté dans : v16.0.0

Détails supplémentaires spécifiques au entryType.

performanceNodeEntry.flags

[Historique]

VersionModifications
v16.0.0Obsolète lors de l’exécution. Maintenant déplacé vers la propriété detail lorsque entryType est « gc ».
v13.9.0, v12.17.0Ajouté dans : v13.9.0, v12.17.0

[Stable : 0 - Obsolète]

Stable : 0 Stabilité : 0 - Obsolète : Utiliser plutôt performanceNodeEntry.detail.

Lorsque performanceEntry.entryType est égal à 'gc', la propriété performance.flags contient des informations supplémentaires sur l’opération de garbage collection. La valeur peut être l’une des suivantes :

  • 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

[Historique]

VersionModifications
v16.0.0Obsolète lors de l’exécution. Maintenant déplacé vers la propriété detail lorsque entryType est « gc ».
v8.5.0Ajouté dans : v8.5.0

[Stable : 0 - Obsolète]

Stable : 0 Stabilité : 0 - Obsolète : Utiliser plutôt performanceNodeEntry.detail.

Lorsque performanceEntry.entryType est égal à 'gc', la propriété performance.kind identifie le type d’opération de garbage collection qui s’est produite. La valeur peut être l’une des suivantes :

  • 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

Détails du ramasse-miettes ('gc')

Lorsque performanceEntry.type est égal à 'gc', la propriété performanceNodeEntry.detail sera un <Object> avec deux propriétés :

  • kind <number> Un parmi :

    • 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> Un parmi :

    • 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

Détails HTTP ('http')

Lorsque performanceEntry.type est égal à 'http', la propriété performanceNodeEntry.detail sera un <Object> contenant des informations supplémentaires.

Si performanceEntry.name est égal à HttpClient, le detail contiendra les propriétés suivantes : req, res. Et la propriété req sera un <Object> contenant method, url, headers, la propriété res sera un <Object> contenant statusCode, statusMessage, headers.

Si performanceEntry.name est égal à HttpRequest, le detail contiendra les propriétés suivantes : req, res. Et la propriété req sera un <Object> contenant method, url, headers, la propriété res sera un <Object> contenant statusCode, statusMessage, headers.

Cela pourrait ajouter une surcharge de mémoire supplémentaire et ne devrait être utilisé qu'à des fins de diagnostic, et non pas être activé par défaut en production.

Détails de HTTP/2 ('http2')

Lorsque performanceEntry.type est égal à 'http2', la propriété performanceNodeEntry.detail sera un <Object> contenant des informations de performance supplémentaires.

Si performanceEntry.name est égal à Http2Stream, le detail contiendra les propriétés suivantes :

  • bytesRead <number> Le nombre d’octets de trame DATA reçus pour ce Http2Stream.
  • bytesWritten <number> Le nombre d’octets de trame DATA envoyés pour ce Http2Stream.
  • id <number> L’identifiant du Http2Stream associé
  • timeToFirstByte <number> Le nombre de millisecondes écoulées entre le startTime de PerformanceEntry et la réception de la première trame DATA.
  • timeToFirstByteSent <number> Le nombre de millisecondes écoulées entre le startTime de PerformanceEntry et l’envoi de la première trame DATA.
  • timeToFirstHeader <number> Le nombre de millisecondes écoulées entre le startTime de PerformanceEntry et la réception du premier en-tête.

Si performanceEntry.name est égal à Http2Session, le detail contiendra les propriétés suivantes :

  • bytesRead <number> Le nombre d’octets reçus pour cette Http2Session.
  • bytesWritten <number> Le nombre d’octets envoyés pour cette Http2Session.
  • framesReceived <number> Le nombre de trames HTTP/2 reçues par la Http2Session.
  • framesSent <number> Le nombre de trames HTTP/2 envoyées par la Http2Session.
  • maxConcurrentStreams <number> Le nombre maximal de flux ouverts simultanément pendant la durée de vie de la Http2Session.
  • pingRTT <number> Le nombre de millisecondes écoulées entre la transmission d’une trame PING et la réception de son accusé de réception. Présent uniquement si une trame PING a été envoyée sur la Http2Session.
  • streamAverageDuration <number> La durée moyenne (en millisecondes) pour toutes les instances de Http2Stream.
  • streamCount <number> Le nombre d’instances de Http2Stream traitées par la Http2Session.
  • type <string> Soit 'server' soit 'client' pour identifier le type de Http2Session.

Timerify ('function') Détails

Lorsque performanceEntry.type est égal à 'function', la propriété performanceNodeEntry.detail sera un <Array> listant les arguments d'entrée de la fonction chronométrée.

Net ('net') Détails

Lorsque performanceEntry.type est égal à 'net', la propriété performanceNodeEntry.detail sera un <Object> contenant des informations supplémentaires.

Si performanceEntry.name est égal à connect, le detail contiendra les propriétés suivantes : host, port.

DNS ('dns') Détails

Lorsque performanceEntry.type est égal à 'dns', la propriété performanceNodeEntry.detail sera un <Object> contenant des informations supplémentaires.

Si performanceEntry.name est égal à lookup, le detail contiendra les propriétés suivantes : hostname, family, hints, verbatim, addresses.

Si performanceEntry.name est égal à lookupService, le detail contiendra les propriétés suivantes : host, port, hostname, service.

Si performanceEntry.name est égal à queryxxx ou getHostByAddr, le detail contiendra les propriétés suivantes : host, ttl, result. La valeur de result est identique au résultat de queryxxx ou getHostByAddr.

Classe : PerformanceNodeTiming

Ajouté dans : v8.5.0

Cette propriété est une extension de Node.js. Elle n’est pas disponible dans les navigateurs Web.

Fournit des détails de minutage pour Node.js lui-même. Le constructeur de cette classe n'est pas exposé aux utilisateurs.

performanceNodeTiming.bootstrapComplete

Ajouté dans : v8.5.0

L'horodatage haute résolution en millisecondes auquel le processus Node.js a terminé l'amorçage. Si l'amorçage n'est pas encore terminé, la propriété a la valeur -1.

performanceNodeTiming.environment

Ajouté dans : v8.5.0

L’horodatage haute résolution en millisecondes auquel l’environnement Node.js a été initialisé.

performanceNodeTiming.idleTime

Ajouté dans : v14.10.0, v12.19.0

L’horodatage haute résolution en millisecondes de la durée pendant laquelle la boucle d’événements est restée inactive dans le fournisseur d’événements de la boucle d’événements (par ex., epoll_wait). Cela ne prend pas en compte l’utilisation du CPU. Si la boucle d’événements n’a pas encore démarré (par ex., au premier tick du script principal), la propriété a la valeur 0.

performanceNodeTiming.loopExit

Ajouté dans : v8.5.0

L’horodatage haute résolution en millisecondes auquel la boucle d’événements Node.js s’est terminée. Si la boucle d’événements n’est pas encore terminée, la propriété a la valeur -1. Elle ne peut avoir une valeur différente de -1 que dans un gestionnaire de l’événement 'exit'.

performanceNodeTiming.loopStart

Ajouté dans : v8.5.0

L’horodatage haute résolution en millisecondes auquel la boucle d’événements Node.js a démarré. Si la boucle d’événements n’a pas encore démarré (par ex., au premier tick du script principal), la propriété a la valeur -1.

performanceNodeTiming.nodeStart

Ajouté dans : v8.5.0

L’horodatage haute résolution en millisecondes auquel le processus Node.js a été initialisé.

performanceNodeTiming.uvMetricsInfo

Ajouté dans : v22.8.0, v20.18.0

  • Retourne : <Object>
    • loopCount <number> Nombre d’itérations de la boucle d’événements.
    • events <number> Nombre d’événements qui ont été traités par le gestionnaire d’événements.
    • eventsWaiting <number> Nombre d’événements qui attendaient d’être traités lorsque le fournisseur d’événements a été appelé.

Il s’agit d’un wrapper de la fonction uv_metrics_info. Il renvoie l’ensemble actuel de mesures de la boucle d’événements.

Il est recommandé d’utiliser cette propriété dans une fonction dont l’exécution a été planifiée à l’aide de setImmediate pour éviter de collecter des mesures avant de terminer toutes les opérations planifiées lors de l’itération actuelle de la boucle.

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

Ajouté dans : v8.5.0

L'horodatage en millisecondes haute résolution auquel la plateforme V8 a été initialisée.

Classe : PerformanceResourceTiming

Ajouté dans : v18.2.0, v16.17.0

Fournit des données de synchronisation réseau détaillées concernant le chargement des ressources d'une application.

Le constructeur de cette classe n'est pas directement exposé aux utilisateurs.

performanceResourceTiming.workerStart

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

L'horodatage en millisecondes haute résolution immédiatement avant l'envoi de la requête fetch. Si la ressource n'est pas interceptée par un worker, la propriété renverra toujours 0.

performanceResourceTiming.redirectStart

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

L'horodatage en millisecondes haute résolution qui représente l'heure de début de la récupération qui initie la redirection.

performanceResourceTiming.redirectEnd

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

L'horodatage en millisecondes haute résolution qui sera créé immédiatement après la réception du dernier octet de la réponse de la dernière redirection.

performanceResourceTiming.fetchStart

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté en : v18.2.0, v16.17.0

Le timestamp en millisecondes haute résolution immédiatement avant que Node.js ne commence à récupérer la ressource.

performanceResourceTiming.domainLookupStart

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté en : v18.2.0, v16.17.0

Le timestamp en millisecondes haute résolution immédiatement avant que Node.js ne commence la recherche de nom de domaine pour la ressource.

performanceResourceTiming.domainLookupEnd

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté en : v18.2.0, v16.17.0

Le timestamp en millisecondes haute résolution représentant l’heure immédiatement après que Node.js a terminé la recherche de nom de domaine pour la ressource.

performanceResourceTiming.connectStart

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté en : v18.2.0, v16.17.0

Le timestamp en millisecondes haute résolution représentant l’heure immédiatement avant que Node.js ne commence à établir la connexion au serveur pour récupérer la ressource.

performanceResourceTiming.connectEnd

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

L'horodatage en millisecondes haute résolution représentant le moment immédiatement après que Node.js a terminé d'établir la connexion au serveur pour récupérer la ressource.

performanceResourceTiming.secureConnectionStart

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

L'horodatage en millisecondes haute résolution représentant le moment immédiatement avant que Node.js ne démarre le processus de négociation pour sécuriser la connexion actuelle.

performanceResourceTiming.requestStart

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

L'horodatage en millisecondes haute résolution représentant le moment immédiatement avant que Node.js ne reçoive le premier octet de la réponse du serveur.

performanceResourceTiming.responseEnd

[Historique]

VersionModifications
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

L'horodatage en millisecondes haute résolution représentant le moment immédiatement après que Node.js a reçu le dernier octet de la ressource ou immédiatement avant la fermeture de la connexion de transport, selon la première éventualité.

performanceResourceTiming.transferSize

[Historique]

VersionChangements
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

Un nombre représentant la taille (en octets) de la ressource récupérée. La taille inclut les champs d'en-tête de la réponse plus le corps de la charge utile de la réponse.

performanceResourceTiming.encodedBodySize

[Historique]

VersionChangements
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

Un nombre représentant la taille (en octets) reçue de la récupération (HTTP ou cache) du corps de la charge utile, avant de supprimer tout codage de contenu appliqué.

performanceResourceTiming.decodedBodySize

[Historique]

VersionChangements
v19.0.0Ce getter de propriété doit être appelé avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

Un nombre représentant la taille (en octets) reçue de la récupération (HTTP ou cache) du corps du message, après avoir supprimé tout codage de contenu appliqué.

performanceResourceTiming.toJSON()

[Historique]

VersionChangements
v19.0.0Cette méthode doit être appelée avec l'objet PerformanceResourceTiming comme récepteur.
v18.2.0, v16.17.0Ajouté dans : v18.2.0, v16.17.0

Retourne un objet qui est la représentation JSON de l'objet PerformanceResourceTiming

Classe : PerformanceObserver

Ajouté dans : v8.5.0

PerformanceObserver.supportedEntryTypes

Ajouté dans : v16.0.0

Obtenir les types pris en charge.

new PerformanceObserver(callback)

[Historique]

VersionModifications
v18.0.0Le passage d'un rappel invalide à l'argument callback lève désormais ERR_INVALID_ARG_TYPE au lieu de ERR_INVALID_CALLBACK.
v8.5.0Ajouté dans : v8.5.0

Les objets PerformanceObserver fournissent des notifications lorsque de nouvelles instances PerformanceEntry ont été ajoutées à la ligne de temps des performances (Performance Timeline).

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

Étant donné que les instances PerformanceObserver introduisent leur propre surcharge de performance supplémentaire, les instances ne doivent pas être laissées abonnées aux notifications indéfiniment. Les utilisateurs doivent déconnecter les observateurs dès qu'ils ne sont plus nécessaires.

Le callback est invoqué lorsqu'un PerformanceObserver est notifié de nouvelles instances PerformanceEntry. Le rappel reçoit une instance PerformanceObserverEntryList et une référence au PerformanceObserver.

performanceObserver.disconnect()

Ajouté dans : v8.5.0

Déconnecte l'instance PerformanceObserver de toutes les notifications.

performanceObserver.observe(options)

[Historique]

VersionChangements
v16.7.0Mise à jour pour être conforme à Performance Timeline Level 2. L'option buffered a été réajoutée.
v16.0.0Mise à jour pour être conforme à User Timing Level 3. L'option buffered a été supprimée.
v8.5.0Ajoutée dans : v8.5.0
  • options <Object>
    • type <string> Un seul type de <PerformanceEntry>. Ne doit pas être spécifié si entryTypes est déjà spécifié.
    • entryTypes <string[]> Un tableau de chaînes identifiant les types d'instances <PerformanceEntry> qui intéressent l'observateur. Si non fourni, une erreur sera levée.
    • buffered <boolean> Si true, le callback de l'observateur est appelé avec une liste des entrées PerformanceEntry globales mises en mémoire tampon. Si false, seules les PerformanceEntry créées après le point temporel sont envoyées au callback de l'observateur. Par défaut : false.

Abonne l'instance de <PerformanceObserver> aux notifications des nouvelles instances de <PerformanceEntry> identifiées soit par options.entryTypes soit par options.type :

js
import { performance, PerformanceObserver } from 'node:perf_hooks'

const obs = new PerformanceObserver((list, observer) => {
  // Appelé une fois de manière asynchrone. `list` contient trois éléments.
})
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) => {
  // Appelé une fois de manière asynchrone. `list` contient trois éléments.
})
obs.observe({ type: 'mark' })

for (let n = 0; n < 3; n++) performance.mark(`test${n}`)

performanceObserver.takeRecords()

Ajouté dans : v16.0.0

  • Retourne : <PerformanceEntry[]> Liste actuelle des entrées stockées dans l'observateur de performance, en la vidant.

Classe : PerformanceObserverEntryList

Ajouté dans : v8.5.0

La classe PerformanceObserverEntryList est utilisée pour fournir un accès aux instances PerformanceEntry transmises à un PerformanceObserver. Le constructeur de cette classe n'est pas exposé aux utilisateurs.

performanceObserverEntryList.getEntries()

Ajouté dans : v8.5.0

Retourne une liste d'objets PerformanceEntry par ordre chronologique en ce qui concerne performanceEntry.startTime.

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

Ajouté dans la version : v8.5.0

Retourne une liste d’objets PerformanceEntry dans l’ordre chronologique par rapport à performanceEntry.startTime dont performanceEntry.name est égal à name, et éventuellement, dont performanceEntry.entryType est égal à type.

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)

Ajouté dans : v8.5.0

Retourne une liste d'objets PerformanceEntry par ordre chronologique par rapport à performanceEntry.startTime dont performanceEntry.entryType est égal à type.

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

Ajouté dans : v15.9.0, v14.18.0

  • options <Object>

    • lowest <number> | <bigint> La valeur discernable la plus basse. Doit être une valeur entière supérieure à 0. Par défaut : 1.
    • highest <number> | <bigint> La valeur enregistrable la plus élevée. Doit être une valeur entière supérieure ou égale à deux fois lowest. Par défaut : Number.MAX_SAFE_INTEGER.
    • figures <number> Le nombre de chiffres de précision. Doit être un nombre compris entre 1 et 5. Par défaut : 3.
  • Retourne : <RecordableHistogram>

Retourne un <RecordableHistogram>.

perf_hooks.monitorEventLoopDelay([options])

Ajouté dans : v11.10.0

Cette propriété est une extension de Node.js. Elle n’est pas disponible dans les navigateurs Web.

Crée un objet IntervalHistogram qui échantillonne et signale le délai de la boucle d’événements dans le temps. Les délais seront signalés en nanosecondes.

L’utilisation d’un minuteur pour détecter le délai approximatif de la boucle d’événements fonctionne parce que l’exécution des minuteurs est liée spécifiquement au cycle de vie de la boucle d’événements libuv. C’est-à-dire qu’un délai dans la boucle entraînera un délai dans l’exécution du minuteur, et ces délais sont précisément ce que cette API est censée détecter.

js
import { monitorEventLoopDelay } from 'node:perf_hooks'

const h = monitorEventLoopDelay({ resolution: 20 })
h.enable()
// Faire quelque chose.
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()
// Faire quelque chose.
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))

Class : Histogram

Ajouté dans : v11.10.0

histogram.count

Ajouté dans : v17.4.0, v16.14.0

Le nombre d’échantillons enregistrés par l’histogramme.

histogram.countBigInt

Ajouté dans : v17.4.0, v16.14.0

Le nombre d’échantillons enregistrés par l’histogramme.

histogram.exceeds

Ajouté dans : v11.10.0

Le nombre de fois où le délai de la boucle d'événements a dépassé le seuil maximal de délai de boucle d'événements d'une heure.

histogram.exceedsBigInt

Ajouté dans : v17.4.0, v16.14.0

Le nombre de fois où le délai de la boucle d'événements a dépassé le seuil maximal de délai de boucle d'événements d'une heure.

histogram.max

Ajouté dans : v11.10.0

Le délai maximal enregistré de la boucle d'événements.

histogram.maxBigInt

Ajouté dans : v17.4.0, v16.14.0

Le délai maximal enregistré de la boucle d'événements.

histogram.mean

Ajouté dans : v11.10.0

La moyenne des délais de boucle d'événements enregistrés.

histogram.min

Ajouté dans : v11.10.0

Le délai minimal enregistré de la boucle d'événements.

histogram.minBigInt

Ajouté dans : v17.4.0, v16.14.0

Le délai minimal enregistré de la boucle d'événements.

histogram.percentile(percentile)

Ajouté dans : v11.10.0

  • percentile <nombre> Une valeur de centile dans la plage (0, 100].
  • Retourne : <nombre>

Retourne la valeur au centile donné.

histogram.percentileBigInt(percentile)

Ajouté dans : v17.4.0, v16.14.0

  • percentile <nombre> Une valeur de centile dans la plage (0, 100].
  • Retourne : <bigint>

Retourne la valeur au centile donné.

histogram.percentiles

Ajouté dans : v11.10.0

Renvoie un objet Map détaillant la distribution percentile accumulée.

histogram.percentilesBigInt

Ajouté dans : v17.4.0, v16.14.0

Renvoie un objet Map détaillant la distribution percentile accumulée.

histogram.reset()

Ajouté dans : v11.10.0

Réinitialise les données d’histogramme collectées.

histogram.stddev

Ajouté dans : v11.10.0

L’écart-type des délais de boucle d’événements enregistrés.

Class : IntervalHistogram extends Histogram

Un Histogram mis à jour périodiquement à un intervalle donné.

histogram.disable()

Ajouté dans : v11.10.0

Désactive le minuteur d’intervalle de mise à jour. Renvoie true si le minuteur a été arrêté, false s’il était déjà arrêté.

histogram.enable()

Ajouté dans : v11.10.0

Active le minuteur d’intervalle de mise à jour. Renvoie true si le minuteur a été démarré, false s’il était déjà démarré.

Clonage d’un IntervalHistogram

Les instances <IntervalHistogram> peuvent être clonées via <MessagePort>. Du côté de la réception, l’histogramme est cloné en tant qu’objet <Histogram> simple qui n’implémente pas les méthodes enable() et disable().

Class : RecordableHistogram extends Histogram

Ajouté dans : v15.9.0, v14.18.0

histogram.add(other)

Ajouté dans : v17.4.0, v16.14.0

Ajoute les valeurs de other à cet histogramme.

histogram.record(val)

Ajouté dans : v15.9.0, v14.18.0

histogram.recordDelta()

Ajouté dans : v15.9.0, v14.18.0

Calcule la durée (en nanosecondes) écoulée depuis l'appel précédent à recordDelta() et enregistre cette durée dans l'histogramme.

Exemples

Mesurer la durée des opérations asynchrones

L'exemple suivant utilise les API Hooks asynchrones et Performance pour mesurer la durée réelle d'une opération Timeout (y compris le temps nécessaire à l'exécution du rappel).

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)

Mesurer le temps nécessaire pour charger les dépendances

L'exemple suivant mesure la durée des opérations require() pour charger les dépendances :

js
import { performance, PerformanceObserver } from 'node:perf_hooks'

// Activer l’observateur
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')

// Patch de singe de la fonction require
mod.Module.prototype.require = performance.timerify(mod.Module.prototype.require)
require = performance.timerify(require)

// Activer l’observateur
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')

Mesurer le temps que prend un aller-retour HTTP

L'exemple suivant est utilisé pour suivre le temps passé par le client HTTP (OutgoingMessage) et la requête HTTP (IncomingMessage). Pour le client HTTP, cela signifie l'intervalle de temps entre le début de la requête et la réception de la réponse, et pour la requête HTTP, cela signifie l'intervalle de temps entre la réception de la requête et l'envoi de la réponse :

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

Mesurer le temps que prend net.connect (uniquement pour TCP) lorsque la connexion réussit

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

Mesurer le temps que prend le DNS lorsque la requête réussit

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