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:
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')
})
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ón | Cambios |
---|---|
v19.0.0 | Este método debe llamarse con el objeto performance como receptor. |
v8.5.0 | Añadido en: v8.5.0 |
name
<string>
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ón | Cambios |
---|---|
v19.0.0 | Este método debe llamarse con el objeto performance como receptor. |
v16.7.0 | Añadido en: v16.7.0 |
name
<string>
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ón | Cambios |
---|---|
v19.0.0 | Este método debe ser llamado con el objeto performance como receptor. |
v18.2.0, v16.17.0 | Añadido en: v18.2.0, v16.17.0 |
name
<string>
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 aeventLoopUtilization()
.utilization2
<Objeto> El resultado de una llamada previa aeventLoopUtilization()
anterior autilization1
.- 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.
import { eventLoopUtilization } from 'node:perf_hooks'
import { spawnSync } from 'node:child_process'
setImmediate(() => {
const elu = eventLoopUtilization()
spawnSync('sleep', ['5'])
console.log(eventLoopUtilization(elu).utilization)
})
'use strict'
const { eventLoopUtilization } = require('node:perf_hooks').performance
const { spawnSync } = require('node:child_process')
setImmediate(() => {
const elu = eventLoopUtilization()
spawnSync('sleep', ['5'])
console.log(eventLoopUtilization(elu).utilization)
})
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ón | Cambios |
---|---|
v19.0.0 | Este método debe llamarse con el objeto performance como receptor. |
v16.7.0 | Añadido en: v16.7.0 |
- Devuelve: <PerformanceEntry[]>
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ón | Cambios |
---|---|
v19.0.0 | Este método debe llamarse con el objeto performance como receptor. |
v16.7.0 | Añadido en: v16.7.0 |
name
<string>type
<string>- Devuelve: <PerformanceEntry[]>
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ón | Cambios |
---|---|
v19.0.0 | Este método debe ser llamado con el objeto performance como receptor. |
v16.7.0 | Añadido en: v16.7.0 |
type
<string>- Devuelve: <PerformanceEntry[]>
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ón | Cambios |
---|---|
v19.0.0 | Este método debe ser llamado con el objeto performance como receptor. El argumento name ya no es opcional. |
v16.0.0 | Actualizado para cumplir con la especificación User Timing Level 3. |
v8.5.0 | Añadido en: v8.5.0 |
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ón | Cambios |
---|---|
v22.2.0 | Se agregaron los argumentos bodyInfo, responseStatus y deliveryType. |
v18.2.0, v16.17.0 | Agregado en: v18.2.0, v16.17.0 |
timingInfo
<Object> Fetch Timing InforequestedUrl
<string> La URL del recursoinitiatorType
<string> El nombre del iniciador, por ejemplo: 'fetch'global
<Object>cacheMode
<string> El modo de caché debe ser una cadena vacía ('') o 'local'bodyInfo
<Object> Fetch Response Body InforesponseStatus
<number> El código de estado de la respuestadeliveryType
<string> El tipo de entrega. Predeterminado:''
.
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ón | Cambios |
---|---|
v19.0.0 | Este método debe ser llamado con el objeto performance como receptor. |
v16.0.0 | Actualizado para cumplir con la especificación User Timing Level 3. |
v13.13.0, v12.16.3 | Hacer que los parámetros startMark y endMark sean opcionales. |
v8.5.0 | Añ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 sistartMarkOrOptions
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ón | Cambios |
---|---|
v19.0.0 | Este método debe ser llamado con el objeto performance como receptor. |
v8.5.0 | Añadido en: v8.5.0 |
- Devuelve: <number>
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ón | Cambios |
---|---|
v19.0.0 | Este método debe ser llamado con el objeto performance como receptor. |
v18.8.0 | Añ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ón | Cambios |
---|---|
v16.0.0 | Se agregó la opción histograma. |
v16.0.0 | Se reimplementó para usar JavaScript puro y la capacidad de cronometrar funciones asíncronas. |
v8.5.0 | Agregado en: v8.5.0 |
fn
<Function>options
<Object>histogram
<RecordableHistogram> Un objeto histograma creado utilizandoperf_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.
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()
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ón | Cambios |
---|---|
v19.0.0 | Este método debe ser llamado con el objeto performance como receptor. |
v16.1.0 | Agregado 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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceEntry como receptor. |
v8.5.0 | Agregado 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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceEntry como receptor. |
v8.5.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceEntry como receptor. |
v8.5.0 | Añadido en: v8.5.0 |
El nombre de la entrada de rendimiento.
performanceEntry.startTime
[Historial]
Versión | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceEntry como receptor. |
v8.5.0 | Añ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
- Extiende: <PerformanceEntry>
Expone las marcas creadas a través del método Performance.mark()
.
performanceMark.detail
[Historial]
Versión | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceMark como receptor. |
v16.0.0 | Añ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
- Extiende: <PerformanceEntry>
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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceMeasure como receptor. |
v16.0.0 | Agregado en: v16.0.0 |
Detalle adicional especificado al crear con el método Performance.measure()
.
Clase: PerformanceNodeEntry
Agregado en: v19.0.0
- Extiende: <PerformanceEntry>
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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceNodeEntry como receptor. |
v16.0.0 | Agregado en: v16.0.0 |
Detalle adicional específico para el entryType
.
performanceNodeEntry.flags
[Historial]
Versión | Cambios |
---|---|
v16.0.0 | En desuso en tiempo de ejecución. Ahora se ha movido a la propiedad detail cuando entryType es 'gc'. |
v13.9.0, v12.17.0 | Añ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ón | Cambios |
---|---|
v16.0.0 | Obsoleto en tiempo de ejecución. Ahora se mueve a la propiedad detail cuando entryType es 'gc'. |
v8.5.0 | Añ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 fotogramasDATA
recibidos para esteHttp2Stream
.bytesWritten
<número> La cantidad de bytes de fotogramasDATA
enviados para esteHttp2Stream
.id
<número> El identificador delHttp2Stream
asociadotimeToFirstByte
<número> La cantidad de milisegundos transcurridos entre elstartTime
dePerformanceEntry
y la recepción del primer fotogramaDATA
.timeToFirstByteSent
<número> La cantidad de milisegundos transcurridos entre elstartTime
dePerformanceEntry
y el envío del primer fotogramaDATA
.timeToFirstHeader
<número> La cantidad de milisegundos transcurridos entre elstartTime
dePerformanceEntry
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 estaHttp2Session
.bytesWritten
<número> La cantidad de bytes enviados para estaHttp2Session
.framesReceived
<número> La cantidad de fotogramas HTTP/2 recibidos porHttp2Session
.framesSent
<número> La cantidad de fotogramas HTTP/2 enviados porHttp2Session
.maxConcurrentStreams
<número> La cantidad máxima de flujos abiertos simultáneamente durante la vida útil deHttp2Session
.pingRTT
<número> La cantidad de milisegundos transcurridos desde la transmisión de un fotogramaPING
y la recepción de su acuse de recibo. Solo está presente si se ha enviado un fotogramaPING
enHttp2Session
.streamAverageDuration
<número> La duración promedio (en milisegundos) para todas las instancias deHttp2Stream
.streamCount
<número> La cantidad de instancias deHttp2Stream
procesadas porHttp2Session
.type
<cadena> Ya sea'server'
o'client'
para identificar el tipo deHttp2Session
.
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
- Extiende: <PerformanceEntry>
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>
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.
const { performance } = require('node:perf_hooks')
setImmediate(() => {
console.log(performance.nodeTiming.uvMetricsInfo)
})
import { performance } from 'node:perf_hooks'
setImmediate(() => {
console.log(performance.nodeTiming.uvMetricsInfo)
})
performanceNodeTiming.v8Start
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
- Extiende: <PerformanceEntry>
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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe llamarse con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe llamarse con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe llamarse con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este getter de propiedad debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v19.0.0 | Este método debe ser llamado con el objeto PerformanceResourceTiming como receptor. |
v18.2.0, v16.17.0 | Añ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ón | Cambios |
---|---|
v18.0.0 | Pasar una devolución de llamada inválida al argumento callback ahora arroja ERR_INVALID_ARG_TYPE en lugar de ERR_INVALID_CALLBACK . |
v8.5.0 | Añadido en: v8.5.0 |
callback
<Function>list
<PerformanceObserverEntryList>observer
<PerformanceObserver>
Los objetos PerformanceObserver
proporcionan notificaciones cuando se han añadido nuevas instancias de PerformanceEntry
a la línea de tiempo de rendimiento.
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries())
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark'], buffered: true })
performance.mark('test')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries())
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark'], buffered: true })
performance.mark('test')
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ón | Cambios |
---|---|
v16.7.0 | Actualizado para cumplir con Performance Timeline Level 2. La opción buffered se ha vuelto a añadir. |
v16.0.0 | Actualizado para cumplir con User Timing Level 3. Se ha eliminado la opción buffered. |
v8.5.0 | Agregado en: v8.5.0 |
options
<Objeto>type
<string> Un único tipo <PerformanceEntry>. No se debe indicar si ya se ha especificadoentryTypes
.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 globalesPerformanceEntry
almacenadas en búfer. Si es false, solo se envían a la función de devolución de llamada del observador lasPerformanceEntry
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
:
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}`)
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: <PerformanceEntry[]>
Devuelve una lista de objetos PerformanceEntry
en orden cronológico con respecto a performanceEntry.startTime
.
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntries())
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 81.465639,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 81.860064,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntries())
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 81.465639,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 81.860064,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
performanceObserverEntryList.getEntriesByName(name[, type])
Añadido en: v8.5.0
name
<string>type
<string>- Devuelve: <PerformanceEntry[]>
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
.
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByName('meow'))
/**
* [
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 98.545991,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('nope')) // []
console.log(perfObserverList.getEntriesByName('test', 'mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 63.518931,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('test', 'measure')) // []
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark', 'measure'] })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByName('meow'))
/**
* [
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 98.545991,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('nope')) // []
console.log(perfObserverList.getEntriesByName('test', 'mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 63.518931,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('test', 'measure')) // []
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark', 'measure'] })
performance.mark('test')
performance.mark('meow')
performanceObserverEntryList.getEntriesByType(type)
Añadido en: v8.5.0
type
<string>- Devuelve: <PerformanceEntry[]>
Devuelve una lista de objetos PerformanceEntry
en orden cronológico con respecto a performanceEntry.startTime
cuyo performanceEntry.entryType
sea igual a type
.
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByType('mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 55.897834,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 56.350146,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByType('mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 55.897834,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 56.350146,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
perf_hooks.createHistogram([options])
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 veceslowest
. Predeterminado:Number.MAX_SAFE_INTEGER
.figures
<número> El número de dígitos de precisión. Debe ser un número entre1
y5
. Predeterminado:3
.
Devuelve: <RecordableHistogram>
Devuelve un <RecordableHistogram>.
perf_hooks.monitorEventLoopDelay([options])
Agregado en: v11.10.0
options
<Object>resolution
<number> La tasa de muestreo en milisegundos. Debe ser mayor que cero. Predeterminado:10
.
Devuelve: <IntervalHistogram>
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.
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))
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
Devuelve el valor en el percentil dado.
histogram.percentileBigInt(percentile)
Agregado en: v17.4.0, v16.14.0
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
- Devuelve: <boolean>
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
- Devuelve: <boolean>
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
other
<RecordableHistogram>
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).
import { createHook } from 'node:async_hooks'
import { performance, PerformanceObserver } from 'node:perf_hooks'
const set = new Set()
const hook = createHook({
init(id, type) {
if (type === 'Timeout') {
performance.mark(`Timeout-${id}-Init`)
set.add(id)
}
},
destroy(id) {
if (set.has(id)) {
set.delete(id)
performance.mark(`Timeout-${id}-Destroy`)
performance.measure(`Timeout-${id}`, `Timeout-${id}-Init`, `Timeout-${id}-Destroy`)
}
},
})
hook.enable()
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries()[0])
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['measure'], buffered: true })
setTimeout(() => {}, 1000)
'use strict'
const async_hooks = require('node:async_hooks')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const set = new Set()
const hook = async_hooks.createHook({
init(id, type) {
if (type === 'Timeout') {
performance.mark(`Timeout-${id}-Init`)
set.add(id)
}
},
destroy(id) {
if (set.has(id)) {
set.delete(id)
performance.mark(`Timeout-${id}-Destroy`)
performance.measure(`Timeout-${id}`, `Timeout-${id}-Init`, `Timeout-${id}-Destroy`)
}
},
})
hook.enable()
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries()[0])
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['measure'], buffered: true })
setTimeout(() => {}, 1000)
Midiendo el tiempo que tardan en cargarse las dependencias
El siguiente ejemplo mide la duración de las operaciones require()
para cargar dependencias:
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')
'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:
import { PerformanceObserver } from 'node:perf_hooks'
import { createServer, get } from 'node:http'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['http'] })
const PORT = 8080
createServer((req, res) => {
res.end('ok')
}).listen(PORT, () => {
get(`http://127.0.0.1:${PORT}`)
})
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const http = require('node:http')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['http'] })
const PORT = 8080
http
.createServer((req, res) => {
res.end('ok')
})
.listen(PORT, () => {
http.get(`http://127.0.0.1:${PORT}`)
})
Medición del tiempo que tarda net.connect
(solo para TCP) cuando la conexión es exitosa
import { PerformanceObserver } from 'node:perf_hooks'
import { connect, createServer } from 'node:net'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['net'] })
const PORT = 8080
createServer(socket => {
socket.destroy()
}).listen(PORT, () => {
connect(PORT)
})
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const net = require('node:net')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['net'] })
const PORT = 8080
net
.createServer(socket => {
socket.destroy()
})
.listen(PORT, () => {
net.connect(PORT)
})
Medición del tiempo que tarda el DNS cuando la solicitud es exitosa
import { PerformanceObserver } from 'node:perf_hooks'
import { lookup, promises } from 'node:dns'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['dns'] })
lookup('localhost', () => {})
promises.resolve('localhost')
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const dns = require('node:dns')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['dns'] })
dns.lookup('localhost', () => {})
dns.promises.resolve('localhost')