Skip to content

APIs de medición de rendimiento

[Estable: 2 - Estable]

Estable: 2 Estabilidad: 2 - Estable

Código fuente: lib/perf_hooks.js

Este módulo proporciona una implementación de un subconjunto de las APIs de rendimiento web de W3C, así como APIs adicionales para mediciones de rendimiento específicas de Node.js.

Node.js admite las siguientes APIs de rendimiento web:

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('Inicio hasta ahora')

performance.mark('A')
doSomeLongRunningProcess(() => {
  performance.measure('A hasta ahora', 'A')

  performance.mark('B')
  performance.measure('A hasta 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('Inicio hasta ahora')

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

  performance.mark('B')
  performance.measure('A hasta B', 'A', 'B')
})()

perf_hooks.performance

Añadido en: v8.5.0

Un objeto que se puede usar para recopilar métricas de rendimiento de la instancia actual de Node.js. Es similar a window.performance en los navegadores.

performance.clearMarks([name])

[Historial]

VersiónCambios
v19.0.0Este método debe llamarse con el objeto performance como receptor.
v8.5.0Añadido en: v8.5.0

Si no se proporciona name, elimina todos los objetos PerformanceMark de la línea de tiempo de rendimiento. Si se proporciona name, elimina solo la marca nombrada.

performance.clearMeasures([name])

[Historial]

VersiónCambios
v19.0.0Este método debe llamarse con el objeto performance como receptor.
v16.7.0Añadido en: v16.7.0

Si no se proporciona name, elimina todos los objetos PerformanceMeasure de la línea de tiempo de rendimiento. Si se proporciona name, elimina solo la medida nombrada.

performance.clearResourceTimings([name])

[Historial]

VersiónCambios
v19.0.0Este método debe ser llamado con el objeto performance como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

Si no se proporciona name, elimina todos los objetos PerformanceResourceTiming de la línea de tiempo de recursos. Si se proporciona name, elimina solo el recurso nombrado.

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

Añadido en: v14.10.0, v12.19.0

  • utilization1 <Objeto> El resultado de una llamada previa a eventLoopUtilization().
  • utilization2 <Objeto> El resultado de una llamada previa a eventLoopUtilization() anterior a utilization1.
  • Devuelve: <Objeto>

El método eventLoopUtilization() devuelve un objeto que contiene la duración acumulada de tiempo en que el bucle de eventos ha estado tanto inactivo como activo como un temporizador de alta resolución en milisegundos. El valor utilization es la utilización calculada del bucle de eventos (ELU).

Si el arranque aún no ha finalizado en el hilo principal, las propiedades tienen el valor de 0. La ELU está disponible inmediatamente en los hilos Worker ya que el arranque ocurre dentro del bucle de eventos.

Tanto utilization1 como utilization2 son parámetros opcionales.

Si se pasa utilization1, entonces se calcula y devuelve el delta entre los tiempos active y idle de la llamada actual, así como el valor utilization correspondiente (similar a process.hrtime()).

Si se pasan ambos utilization1 y utilization2, entonces el delta se calcula entre los dos argumentos. Esta es una opción de conveniencia porque, a diferencia de process.hrtime(), calcular la ELU es más complejo que una simple resta.

La ELU es similar a la utilización de la CPU, excepto que solo mide las estadísticas del bucle de eventos y no el uso de la CPU. Representa el porcentaje de tiempo que el bucle de eventos ha pasado fuera del proveedor de eventos del bucle de eventos (por ejemplo, epoll_wait). No se tiene en cuenta ningún otro tiempo de inactividad de la CPU. El siguiente es un ejemplo de cómo un proceso mayormente inactivo tendrá una ELU alta.

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

Aunque la CPU está mayormente inactiva mientras se ejecuta este script, el valor de utilization es 1. Esto se debe a que la llamada a child_process.spawnSync() bloquea que el bucle de eventos continúe.

Pasar un objeto definido por el usuario en lugar del resultado de una llamada anterior a eventLoopUtilization() conducirá a un comportamiento indefinido. No se garantiza que los valores devueltos reflejen ningún estado correcto del bucle de eventos.

performance.getEntries()

[Historial]

VersiónCambios
v19.0.0Este método debe llamarse con el objeto performance como receptor.
v16.7.0Añadido en: v16.7.0

Devuelve una lista de objetos PerformanceEntry en orden cronológico con respecto a performanceEntry.startTime. Si solo está interesado en entradas de rendimiento de ciertos tipos o que tengan ciertos nombres, consulte performance.getEntriesByType() y performance.getEntriesByName().

performance.getEntriesByName(name[, type])

[Historial]

VersiónCambios
v19.0.0Este método debe llamarse con el objeto performance como receptor.
v16.7.0Añadido en: v16.7.0

Devuelve una lista de objetos PerformanceEntry en orden cronológico con respecto a performanceEntry.startTime cuyo performanceEntry.name es igual a name y, opcionalmente, cuyo performanceEntry.entryType es igual a type.

performance.getEntriesByType(type)

[Historial]

VersiónCambios
v19.0.0Este método debe ser llamado con el objeto performance como receptor.
v16.7.0Añadido en: v16.7.0

Devuelve una lista de objetos PerformanceEntry en orden cronológico con respecto a performanceEntry.startTime cuyo performanceEntry.entryType es igual a type.

performance.mark(name[, options])

[Historial]

VersiónCambios
v19.0.0Este método debe ser llamado con el objeto performance como receptor. El argumento name ya no es opcional.
v16.0.0Actualizado para cumplir con la especificación User Timing Level 3.
v8.5.0Añadido en: v8.5.0
  • name <string>
  • options <Object>
    • detail <any> Detalle opcional adicional para incluir con la marca.
    • startTime <number> Una marca de tiempo opcional para ser usada como tiempo de la marca. Por defecto: performance.now().

Crea una nueva entrada PerformanceMark en el Performance Timeline. Una PerformanceMark es una subclase de PerformanceEntry cuyo performanceEntry.entryType es siempre 'mark', y cuya performanceEntry.duration es siempre 0. Las marcas de rendimiento se usan para marcar momentos específicos importantes en el Performance Timeline.

La entrada PerformanceMark creada se coloca en el Performance Timeline global y se puede consultar con performance.getEntries, performance.getEntriesByName y performance.getEntriesByType. Cuando se realiza la observación, las entradas deben borrarse manualmente del Performance Timeline global con performance.clearMarks.

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

[Historial]

VersiónCambios
v22.2.0Se agregaron los argumentos bodyInfo, responseStatus y deliveryType.
v18.2.0, v16.17.0Agregado en: v18.2.0, v16.17.0

Esta propiedad es una extensión de Node.js. No está disponible en los navegadores web.

Crea una nueva entrada PerformanceResourceTiming en la línea de tiempo de recursos. Un PerformanceResourceTiming es una subclase de PerformanceEntry cuyo performanceEntry.entryType siempre es 'resource'. Los recursos de rendimiento se utilizan para marcar momentos en la línea de tiempo de recursos.

La entrada PerformanceMark creada se coloca en la línea de tiempo de recursos global y se puede consultar con performance.getEntries, performance.getEntriesByName y performance.getEntriesByType. Cuando se realiza la observación, las entradas deben borrarse manualmente de la línea de tiempo de rendimiento global con performance.clearResourceTimings.

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

[Historial]

VersiónCambios
v19.0.0Este método debe ser llamado con el objeto performance como receptor.
v16.0.0Actualizado para cumplir con la especificación User Timing Level 3.
v13.13.0, v12.16.3Hacer que los parámetros startMark y endMark sean opcionales.
v8.5.0Añadido en: v8.5.0
  • name <string>

  • startMarkOrOptions <string> | <Object> Opcional.

    • detail <any> Detalles opcionales adicionales para incluir con la medida.
    • duration <number> Duración entre los tiempos de inicio y fin.
    • end <number> | <string> Marca de tiempo para ser usada como tiempo de fin, o una cadena que identifica una marca previamente registrada.
    • start <number> | <string> Marca de tiempo para ser usada como tiempo de inicio, o una cadena que identifica una marca previamente registrada.
  • endMark <string> Opcional. Debe omitirse si startMarkOrOptions es un <Object>.

Crea una nueva entrada PerformanceMeasure en la Línea de Tiempo de Rendimiento. Una PerformanceMeasure es una subclase de PerformanceEntry cuyo performanceEntry.entryType siempre es 'measure', y cuya performanceEntry.duration mide el número de milisegundos transcurridos desde startMark y endMark.

El argumento startMark puede identificar cualquier PerformanceMark existente en la Línea de Tiempo de Rendimiento, o puede identificar cualquiera de las propiedades de marca de tiempo proporcionadas por la clase PerformanceNodeTiming. Si el startMark nombrado no existe, se genera un error.

El argumento opcional endMark debe identificar cualquier PerformanceMark existente en la Línea de Tiempo de Rendimiento o cualquiera de las propiedades de marca de tiempo proporcionadas por la clase PerformanceNodeTiming. endMark será performance.now() si no se pasa ningún parámetro, de lo contrario, si el endMark nombrado no existe, se generará un error.

La entrada PerformanceMeasure creada se coloca en la Línea de Tiempo de Rendimiento global y se puede consultar con performance.getEntries, performance.getEntriesByName y performance.getEntriesByType. Cuando se realiza la observación, las entradas deben borrarse manualmente de la Línea de Tiempo de Rendimiento global con performance.clearMeasures.

performance.nodeTiming

Añadido en: v8.5.0

Esta propiedad es una extensión de Node.js. No está disponible en los navegadores web.

Una instancia de la clase PerformanceNodeTiming que proporciona métricas de rendimiento para hitos operativos específicos de Node.js.

performance.now()

[Historial]

VersiónCambios
v19.0.0Este método debe ser llamado con el objeto performance como receptor.
v8.5.0Añadido en: v8.5.0

Devuelve la marca de tiempo actual de alta resolución en milisegundos, donde 0 representa el inicio del proceso node actual.

performance.setResourceTimingBufferSize(maxSize)

[Historial]

VersiónCambios
v19.0.0Este método debe ser llamado con el objeto performance como receptor.
v18.8.0Añadido en: v18.8.0

Establece el tamaño del búfer global de tiempo de recursos de rendimiento al número especificado de objetos de entrada de rendimiento de tipo "recurso".

Por defecto, el tamaño máximo del búfer se establece en 250.

performance.timeOrigin

Agregado en: v8.5.0

El timeOrigin especifica la marca de tiempo en milisegundos de alta resolución en la que comenzó el proceso node actual, medida en tiempo Unix.

performance.timerify(fn[, options])

[Historial]

VersiónCambios
v16.0.0Se agregó la opción histograma.
v16.0.0Se reimplementó para usar JavaScript puro y la capacidad de cronometrar funciones asíncronas.
v8.5.0Agregado en: v8.5.0
  • fn <Function>
  • options <Object>
    • histogram <RecordableHistogram> Un objeto histograma creado utilizando perf_hooks.createHistogram() que registrará las duraciones de tiempo de ejecución en nanosegundos.

Esta propiedad es una extensión de Node.js. No está disponible en los navegadores web.

Envuelve una función dentro de una nueva función que mide el tiempo de ejecución de la función envuelta. Se debe suscribir un PerformanceObserver al tipo de evento 'function' para que se pueda acceder a los detalles de tiempo.

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

function someFunction() {
  console.log('hola mundo')
}

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

// Se creará una entrada de la línea de tiempo de rendimiento
wrapped()
js
const { performance, PerformanceObserver } = require('node:perf_hooks')

function someFunction() {
  console.log('hola mundo')
}

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

// Se creará una entrada de la línea de tiempo de rendimiento
wrapped()

Si la función envuelta devuelve una promesa, se adjuntará un controlador finally a la promesa y la duración se informará una vez que se invoque el controlador finally.

performance.toJSON()

[Historial]

VersiónCambios
v19.0.0Este método debe ser llamado con el objeto performance como receptor.
v16.1.0Agregado en: v16.1.0

Un objeto que es la representación JSON del objeto performance. Es similar a window.performance.toJSON en los navegadores.

Evento: 'resourcetimingbufferfull'

Agregado en: v18.8.0

El evento 'resourcetimingbufferfull' se dispara cuando el búfer global de tiempos de recursos de rendimiento está lleno. Ajuste el tamaño del búfer de tiempos de recursos con performance.setResourceTimingBufferSize() o borre el búfer con performance.clearResourceTimings() en el escuchador de eventos para permitir que se agreguen más entradas al búfer de la línea de tiempo de rendimiento.

Clase: PerformanceEntry

Agregado en: v8.5.0

El constructor de esta clase no se expone directamente a los usuarios.

performanceEntry.duration

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceEntry como receptor.
v8.5.0Agregado en: v8.5.0

El número total de milisegundos transcurridos para esta entrada. Este valor no tendrá significado para todos los tipos de entrada de rendimiento.

performanceEntry.entryType

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceEntry como receptor.
v8.5.0Añadido en: v8.5.0

El tipo de la entrada de rendimiento. Puede ser uno de:

  • 'dns' (Solo en Node.js)
  • 'function' (Solo en Node.js)
  • 'gc' (Solo en Node.js)
  • 'http2' (Solo en Node.js)
  • 'http' (Solo en Node.js)
  • 'mark' (disponible en la Web)
  • 'measure' (disponible en la Web)
  • 'net' (Solo en Node.js)
  • 'node' (Solo en Node.js)
  • 'resource' (disponible en la Web)

performanceEntry.name

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceEntry como receptor.
v8.5.0Añadido en: v8.5.0

El nombre de la entrada de rendimiento.

performanceEntry.startTime

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceEntry como receptor.
v8.5.0Añadido en: v8.5.0

La marca de tiempo de milisegundos de alta resolución que marca el tiempo de inicio de la Entrada de Rendimiento.

Clase: PerformanceMark

Añadido en: v18.2.0, v16.17.0

Expone las marcas creadas a través del método Performance.mark().

performanceMark.detail

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceMark como receptor.
v16.0.0Añadido en: v16.0.0

Detalle adicional especificado al crear con el método Performance.mark().

Clase: PerformanceMeasure

Agregado en: v18.2.0, v16.17.0

Expone medidas creadas a través del método Performance.measure().

El constructor de esta clase no se expone directamente a los usuarios.

performanceMeasure.detail

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceMeasure como receptor.
v16.0.0Agregado en: v16.0.0

Detalle adicional especificado al crear con el método Performance.measure().

Clase: PerformanceNodeEntry

Agregado en: v19.0.0

Esta clase es una extensión de Node.js. No está disponible en navegadores web.

Proporciona datos de tiempo detallados de Node.js.

El constructor de esta clase no se expone directamente a los usuarios.

performanceNodeEntry.detail

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceNodeEntry como receptor.
v16.0.0Agregado en: v16.0.0

Detalle adicional específico para el entryType.

performanceNodeEntry.flags

[Historial]

VersiónCambios
v16.0.0En desuso en tiempo de ejecución. Ahora se ha movido a la propiedad detail cuando entryType es 'gc'.
v13.9.0, v12.17.0Añadido en: v13.9.0, v12.17.0

[Estable: 0 - En desuso]

Estable: 0 Estabilidad: 0 - En desuso: Use performanceNodeEntry.detail en su lugar.

Cuando performanceEntry.entryType es igual a 'gc', la propiedad performance.flags contiene información adicional sobre la operación de recolección de basura. El valor puede ser uno de:

  • 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

[Historial]

VersiónCambios
v16.0.0Obsoleto en tiempo de ejecución. Ahora se mueve a la propiedad detail cuando entryType es 'gc'.
v8.5.0Añadido en: v8.5.0

[Estable: 0 - Obsoleto]

Estable: 0 Estabilidad: 0 - Obsoleto: Use performanceNodeEntry.detail en su lugar.

Cuando performanceEntry.entryType es igual a 'gc', la propiedad performance.kind identifica el tipo de operación de recolección de basura que ocurrió. El valor puede ser uno de:

  • 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

Detalles de Recolección de Basura ('gc')

Cuando performanceEntry.type es igual a 'gc', la propiedad performanceNodeEntry.detail será un <Object> con dos propiedades:

  • kind <number> Uno de:

    • 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> Uno de:

    • 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

Detalles HTTP ('http')

Cuando performanceEntry.type es igual a 'http', la propiedad performanceNodeEntry.detail será un <Objeto> que contiene información adicional.

Si performanceEntry.name es igual a HttpClient, el detail contendrá las siguientes propiedades: req, res. Y la propiedad req será un <Objeto> que contiene method, url, headers, la propiedad res será un <Objeto> que contiene statusCode, statusMessage, headers.

Si performanceEntry.name es igual a HttpRequest, el detail contendrá las siguientes propiedades: req, res. Y la propiedad req será un <Objeto> que contiene method, url, headers, la propiedad res será un <Objeto> que contiene statusCode, statusMessage, headers.

Esto podría agregar una sobrecarga de memoria adicional y solo debe usarse con fines de diagnóstico, no debe dejarse activado en producción de forma predeterminada.

Detalles de HTTP/2 ('http2')

Cuando performanceEntry.type es igual a 'http2', la propiedad performanceNodeEntry.detail será un <Objeto> que contiene información de rendimiento adicional.

Si performanceEntry.name es igual a Http2Stream, el detail contendrá las siguientes propiedades:

  • bytesRead <número> La cantidad de bytes de fotogramas DATA recibidos para este Http2Stream.
  • bytesWritten <número> La cantidad de bytes de fotogramas DATA enviados para este Http2Stream.
  • id <número> El identificador del Http2Stream asociado
  • timeToFirstByte <número> La cantidad de milisegundos transcurridos entre el startTime de PerformanceEntry y la recepción del primer fotograma DATA.
  • timeToFirstByteSent <número> La cantidad de milisegundos transcurridos entre el startTime de PerformanceEntry y el envío del primer fotograma DATA.
  • timeToFirstHeader <número> La cantidad de milisegundos transcurridos entre el startTime de PerformanceEntry y la recepción del primer encabezado.

Si performanceEntry.name es igual a Http2Session, el detail contendrá las siguientes propiedades:

  • bytesRead <número> La cantidad de bytes recibidos para esta Http2Session.
  • bytesWritten <número> La cantidad de bytes enviados para esta Http2Session.
  • framesReceived <número> La cantidad de fotogramas HTTP/2 recibidos por Http2Session.
  • framesSent <número> La cantidad de fotogramas HTTP/2 enviados por Http2Session.
  • maxConcurrentStreams <número> La cantidad máxima de flujos abiertos simultáneamente durante la vida útil de Http2Session.
  • pingRTT <número> La cantidad de milisegundos transcurridos desde la transmisión de un fotograma PING y la recepción de su acuse de recibo. Solo está presente si se ha enviado un fotograma PING en Http2Session.
  • streamAverageDuration <número> La duración promedio (en milisegundos) para todas las instancias de Http2Stream.
  • streamCount <número> La cantidad de instancias de Http2Stream procesadas por Http2Session.
  • type <cadena> Ya sea 'server' o 'client' para identificar el tipo de Http2Session.

Detalles de Timerify ('function')

Cuando performanceEntry.type es igual a 'function', la propiedad performanceNodeEntry.detail será un <Array> que enumera los argumentos de entrada de la función cronometrada.

Detalles de Net ('net')

Cuando performanceEntry.type es igual a 'net', la propiedad performanceNodeEntry.detail será un <Object> que contiene información adicional.

Si performanceEntry.name es igual a connect, el detail contendrá las siguientes propiedades: host, port.

Detalles de DNS ('dns')

Cuando performanceEntry.type es igual a 'dns', la propiedad performanceNodeEntry.detail será un <Object> que contiene información adicional.

Si performanceEntry.name es igual a lookup, el detail contendrá las siguientes propiedades: hostname, family, hints, verbatim, addresses.

Si performanceEntry.name es igual a lookupService, el detail contendrá las siguientes propiedades: host, port, hostname, service.

Si performanceEntry.name es igual a queryxxx o getHostByAddr, el detail contendrá las siguientes propiedades: host, ttl, result. El valor de result es el mismo que el resultado de queryxxx o getHostByAddr.

Clase: PerformanceNodeTiming

Agregado en: v8.5.0

Esta propiedad es una extensión de Node.js. No está disponible en navegadores web.

Proporciona detalles de tiempo para el propio Node.js. El constructor de esta clase no está expuesto a los usuarios.

performanceNodeTiming.bootstrapComplete

Agregado en: v8.5.0

La marca de tiempo en milisegundos de alta resolución en la que el proceso de Node.js completó el arranque. Si el arranque aún no ha finalizado, la propiedad tiene el valor de -1.

performanceNodeTiming.environment

Agregado en: v8.5.0

La marca de tiempo en milisegundos de alta resolución en la que se inicializó el entorno de Node.js.

performanceNodeTiming.idleTime

Agregado en: v14.10.0, v12.19.0

La marca de tiempo en milisegundos de alta resolución de la cantidad de tiempo que el bucle de eventos ha estado inactivo dentro del proveedor de eventos del bucle de eventos (por ejemplo, epoll_wait). Esto no tiene en cuenta el uso de la CPU. Si el bucle de eventos aún no ha comenzado (por ejemplo, en el primer tic del script principal), la propiedad tiene el valor de 0.

performanceNodeTiming.loopExit

Agregado en: v8.5.0

La marca de tiempo de milisegundos de alta resolución en la que el bucle de eventos de Node.js salió. Si el bucle de eventos aún no ha salido, la propiedad tiene el valor de -1. Solo puede tener un valor diferente de -1 en un manejador del evento 'exit'.

performanceNodeTiming.loopStart

Agregado en: v8.5.0

La marca de tiempo de milisegundos de alta resolución en la que se inició el bucle de eventos de Node.js. Si el bucle de eventos aún no se ha iniciado (por ejemplo, en el primer tick del script principal), la propiedad tiene el valor de -1.

performanceNodeTiming.nodeStart

Agregado en: v8.5.0

La marca de tiempo de milisegundos de alta resolución en la que se inicializó el proceso de Node.js.

performanceNodeTiming.uvMetricsInfo

Añadido en: v22.8.0, v20.18.0

  • Retorna: <Objeto>
    • loopCount <número> Número de iteraciones del bucle de eventos.
    • events <número> Número de eventos que han sido procesados por el manejador de eventos.
    • eventsWaiting <número> Número de eventos que estaban esperando ser procesados cuando se llamó al proveedor de eventos.

Este es un envoltorio para la función uv_metrics_info. Devuelve el conjunto actual de métricas del bucle de eventos.

Se recomienda utilizar esta propiedad dentro de una función cuya ejecución fue programada utilizando setImmediate para evitar la recopilación de métricas antes de finalizar todas las operaciones programadas durante la iteración actual del bucle.

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

Añadido en: v8.5.0

La marca de tiempo de alta resolución en milisegundos en la que se inicializó la plataforma V8.

Clase: PerformanceResourceTiming

Añadido en: v18.2.0, v16.17.0

Proporciona datos de tiempo de red detallados sobre la carga de los recursos de una aplicación.

El constructor de esta clase no se expone directamente a los usuarios.

performanceResourceTiming.workerStart

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo de alta resolución en milisegundos inmediatamente antes de enviar la solicitud fetch. Si el recurso no es interceptado por un worker, la propiedad siempre devolverá 0.

performanceResourceTiming.redirectStart

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo en milisegundos de alta resolución que representa la hora de inicio de la búsqueda que inicia la redirección.

performanceResourceTiming.redirectEnd

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo en milisegundos de alta resolución que se creará inmediatamente después de recibir el último byte de la respuesta de la última redirección.

performanceResourceTiming.fetchStart

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe llamarse con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo de milisegundos de alta resolución inmediatamente antes de que Node.js comience a buscar el recurso.

performanceResourceTiming.domainLookupStart

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe llamarse con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo de milisegundos de alta resolución inmediatamente antes de que Node.js comience la búsqueda de nombre de dominio para el recurso.

performanceResourceTiming.domainLookupEnd

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe llamarse con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo de milisegundos de alta resolución que representa el momento inmediatamente después de que Node.js finalizó la búsqueda de nombre de dominio para el recurso.

performanceResourceTiming.connectStart

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo en milisegundos de alta resolución que representa el momento inmediatamente antes de que Node.js comience a establecer la conexión con el servidor para recuperar el recurso.

performanceResourceTiming.connectEnd

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo en milisegundos de alta resolución que representa el momento inmediatamente después de que Node.js termina de establecer la conexión con el servidor para recuperar el recurso.

performanceResourceTiming.secureConnectionStart

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo en milisegundos de alta resolución que representa el momento justo antes de que Node.js inicie el proceso de handshake para asegurar la conexión actual.

performanceResourceTiming.requestStart

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo en milisegundos de alta resolución que representa el momento justo antes de que Node.js reciba el primer byte de la respuesta del servidor.

performanceResourceTiming.responseEnd

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

La marca de tiempo de milisegundos de alta resolución que representa el tiempo inmediatamente después de que Node.js recibe el último byte del recurso o inmediatamente antes de que se cierre la conexión de transporte, lo que ocurra primero.

performanceResourceTiming.transferSize

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

Un número que representa el tamaño (en octetos) del recurso obtenido. El tamaño incluye los campos del encabezado de la respuesta más el cuerpo de la carga útil de la respuesta.

performanceResourceTiming.encodedBodySize

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

Un número que representa el tamaño (en octetos) recibido de la búsqueda (HTTP o caché), del cuerpo de la carga útil, antes de eliminar cualquier codificación de contenido aplicada.

performanceResourceTiming.decodedBodySize

[Historial]

VersiónCambios
v19.0.0Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

Un número que representa el tamaño (en octetos) recibido de la búsqueda (HTTP o caché), del cuerpo del mensaje, después de eliminar cualquier codificación de contenido aplicada.

performanceResourceTiming.toJSON()

[Historial]

VersiónCambios
v19.0.0Este método debe ser llamado con el objeto PerformanceResourceTiming como receptor.
v18.2.0, v16.17.0Añadido en: v18.2.0, v16.17.0

Devuelve un object que es la representación JSON del objeto PerformanceResourceTiming.

Clase: PerformanceObserver

Añadido en: v8.5.0

PerformanceObserver.supportedEntryTypes

Añadido en: v16.0.0

Obtener los tipos soportados.

new PerformanceObserver(callback)

[Historial]

VersiónCambios
v18.0.0Pasar una devolución de llamada inválida al argumento callback ahora arroja ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK.
v8.5.0Añadido en: v8.5.0

Los objetos PerformanceObserver proporcionan notificaciones cuando se han añadido nuevas instancias de PerformanceEntry a la línea de tiempo de rendimiento.

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

Dado que las instancias de PerformanceObserver introducen su propia sobrecarga de rendimiento adicional, no se deben dejar instancias suscritas a las notificaciones indefinidamente. Los usuarios deben desconectar los observadores tan pronto como ya no sean necesarios.

Se invoca la callback cuando un PerformanceObserver recibe una notificación sobre nuevas instancias de PerformanceEntry. La devolución de llamada recibe una instancia de PerformanceObserverEntryList y una referencia al PerformanceObserver.

performanceObserver.disconnect()

Agregado en: v8.5.0

Desconecta la instancia PerformanceObserver de todas las notificaciones.

performanceObserver.observe(options)

[Historial]

VersiónCambios
v16.7.0Actualizado para cumplir con Performance Timeline Level 2. La opción buffered se ha vuelto a añadir.
v16.0.0Actualizado para cumplir con User Timing Level 3. Se ha eliminado la opción buffered.
v8.5.0Agregado en: v8.5.0
  • options <Objeto>
    • type <string> Un único tipo <PerformanceEntry>. No se debe indicar si ya se ha especificado entryTypes.
    • entryTypes <string[]> Una matriz de cadenas que identifica los tipos de instancias de <PerformanceEntry> en las que está interesado el observador. Si no se proporciona, se generará un error.
    • buffered <boolean> Si es true, la función de devolución de llamada del observador se llama con una lista de entradas globales PerformanceEntry almacenadas en búfer. Si es false, solo se envían a la función de devolución de llamada del observador las PerformanceEntry creadas después del punto temporal. Valor predeterminado: false.

Suscribe la instancia <PerformanceObserver> a las notificaciones de nuevas instancias de <PerformanceEntry> identificadas por options.entryTypes u options.type:

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

const obs = new PerformanceObserver((list, observer) => {
  // Se llama una vez de forma asíncrona. `list` contiene tres elementos.
})
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) => {
  // Se llama una vez de forma asíncrona. `list` contiene tres elementos.
})
obs.observe({ type: 'mark' })

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

performanceObserver.takeRecords()

Agregado en: v16.0.0

  • Devuelve: <PerformanceEntry[]> Lista actual de entradas almacenadas en el observador de rendimiento, vaciándola.

Clase: PerformanceObserverEntryList

Agregado en: v8.5.0

La clase PerformanceObserverEntryList se utiliza para proporcionar acceso a las instancias de PerformanceEntry pasadas a un PerformanceObserver. El constructor de esta clase no está expuesto a los usuarios.

performanceObserverEntryList.getEntries()

Agregado en: v8.5.0

Devuelve una lista de objetos PerformanceEntry en orden cronológico con respecto a 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])

Añadido en: v8.5.0

Devuelve una lista de objetos PerformanceEntry en orden cronológico con respecto a performanceEntry.startTime cuyo performanceEntry.name es igual a name y, opcionalmente, cuyo performanceEntry.entryType es igual a 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)

Añadido en: v8.5.0

Devuelve una lista de objetos PerformanceEntry en orden cronológico con respecto a performanceEntry.startTime cuyo performanceEntry.entryType sea igual a 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])

Agregado en: v15.9.0, v14.18.0

  • options <Objeto>

    • lowest <número> | <bigint> El valor discernible más bajo. Debe ser un valor entero mayor que 0. Predeterminado: 1.
    • highest <número> | <bigint> El valor registrable más alto. Debe ser un valor entero que sea igual o mayor que dos veces lowest. Predeterminado: Number.MAX_SAFE_INTEGER.
    • figures <número> El número de dígitos de precisión. Debe ser un número entre 1 y 5. Predeterminado: 3.
  • Devuelve: <RecordableHistogram>

Devuelve un <RecordableHistogram>.

perf_hooks.monitorEventLoopDelay([options])

Agregado en: v11.10.0

Esta propiedad es una extensión de Node.js. No está disponible en navegadores web.

Crea un objeto IntervalHistogram que muestrea e informa el retraso del bucle de eventos a lo largo del tiempo. Los retrasos se informarán en nanosegundos.

Usar un temporizador para detectar el retraso aproximado del bucle de eventos funciona porque la ejecución de los temporizadores está ligada específicamente al ciclo de vida del bucle de eventos libuv. Es decir, un retraso en el bucle provocará un retraso en la ejecución del temporizador, y esos retrasos son específicamente lo que esta API está destinada a detectar.

js
import { monitorEventLoopDelay } from 'node:perf_hooks'

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

Clase: Histograma

Agregado en: v11.10.0

histograma.count

Agregado en: v17.4.0, v16.14.0

El número de muestras registradas por el histograma.

histograma.countBigInt

Agregado en: v17.4.0, v16.14.0

El número de muestras registradas por el histograma.

histograma.exceeds

Agregado en: v11.10.0

El número de veces que el retraso del bucle de eventos excedió el umbral máximo de 1 hora de retraso del bucle de eventos.

histograma.exceedsBigInt

Agregado en: v17.4.0, v16.14.0

El número de veces que el retraso del bucle de eventos excedió el umbral máximo de 1 hora de retraso del bucle de eventos.

histograma.max

Agregado en: v11.10.0

El retraso máximo registrado del bucle de eventos.

histogram.maxBigInt

Agregado en: v17.4.0, v16.14.0

El retardo máximo registrado del bucle de eventos.

histogram.mean

Agregado en: v11.10.0

La media de los retardos registrados del bucle de eventos.

histogram.min

Agregado en: v11.10.0

El retardo mínimo registrado del bucle de eventos.

histogram.minBigInt

Agregado en: v17.4.0, v16.14.0

El retardo mínimo registrado del bucle de eventos.

histogram.percentile(percentile)

Agregado en: v11.10.0

  • percentile <number> Un valor de percentil en el rango (0, 100].
  • Devuelve: <number>

Devuelve el valor en el percentil dado.

histogram.percentileBigInt(percentile)

Agregado en: v17.4.0, v16.14.0

  • percentile <number> Un valor de percentil en el rango (0, 100].
  • Devuelve: <bigint>

Devuelve el valor en el percentil dado.

histogram.percentiles

Agregado en: v11.10.0

Devuelve un objeto Map que detalla la distribución de percentiles acumulada.

histogram.percentilesBigInt

Agregado en: v17.4.0, v16.14.0

Devuelve un objeto Map que detalla la distribución de percentiles acumulada.

histogram.reset()

Agregado en: v11.10.0

Restablece los datos del histograma recopilados.

histogram.stddev

Agregado en: v11.10.0

La desviación estándar de los retrasos registrados en el bucle de eventos.

Clase: IntervalHistogram extends Histogram

Un Histogram que se actualiza periódicamente en un intervalo dado.

histogram.disable()

Agregado en: v11.10.0

Desactiva el temporizador de intervalo de actualización. Devuelve true si el temporizador se detuvo, false si ya estaba detenido.

histogram.enable()

Agregado en: v11.10.0

Activa el temporizador de intervalo de actualización. Devuelve true si el temporizador se inició, false si ya estaba iniciado.

Clonación de un IntervalHistogram

Las instancias de <IntervalHistogram> se pueden clonar a través de <MessagePort>. En el extremo receptor, el histograma se clona como un objeto <Histogram> simple que no implementa los métodos enable() y disable().

Clase: RecordableHistogram extends Histogram

Añadido en: v15.9.0, v14.18.0

histogram.add(other)

Añadido en: v17.4.0, v16.14.0

Agrega los valores de other a este histograma.

histogram.record(val)

Añadido en: v15.9.0, v14.18.0

histogram.recordDelta()

Añadido en: v15.9.0, v14.18.0

Calcula la cantidad de tiempo (en nanosegundos) que ha transcurrido desde la llamada anterior a recordDelta() y registra esa cantidad en el histograma.

Ejemplos

Medición de la duración de operaciones asíncronas

El siguiente ejemplo utiliza los APIs de Async Hooks y Performance para medir la duración real de una operación Timeout (incluida la cantidad de tiempo que tardó en ejecutarse la devolución de llamada).

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)

Midiendo el tiempo que tardan en cargarse las dependencias

El siguiente ejemplo mide la duración de las operaciones require() para cargar dependencias:

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

// Activar el observador
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')

// Modificar la función require
mod.Module.prototype.require = performance.timerify(mod.Module.prototype.require)
require = performance.timerify(require)

// Activar el observador
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')

Midiendo cuánto tiempo toma un viaje de ida y vuelta HTTP

El siguiente ejemplo se utiliza para rastrear el tiempo dedicado por el cliente HTTP (OutgoingMessage) y la solicitud HTTP (IncomingMessage). Para el cliente HTTP, significa el intervalo de tiempo entre el inicio de la solicitud y la recepción de la respuesta, y para la solicitud HTTP, significa el intervalo de tiempo entre la recepción de la solicitud y el envío de la respuesta:

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

Medición del tiempo que tarda net.connect (solo para TCP) cuando la conexión es exitosa

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

Medición del tiempo que tarda el DNS cuando la solicitud es exitosa

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