API di misurazione delle performance
[Stabile: 2 - Stabile]
Stabile: 2 Stabilità: 2 - Stabile
Codice sorgente: lib/perf_hooks.js
Questo modulo fornisce un'implementazione di un sottoinsieme delle API Web Performance del W3C, nonché API aggiuntive per le misurazioni delle prestazioni specifiche di Node.js.
Node.js supporta le seguenti API Web Performance:
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('Inizio fino ad ora')
performance.mark('A')
doSomeLongRunningProcess(() => {
performance.measure('Da A ad ora', 'A')
performance.mark('B')
performance.measure('Da A a 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('Inizio fino ad ora')
performance.mark('A')
;(async function doSomeLongRunningProcess() {
await new Promise(r => setTimeout(r, 5000))
performance.measure('Da A ad ora', 'A')
performance.mark('B')
performance.measure('Da A a B', 'A', 'B')
})()
perf_hooks.performance
Aggiunto in: v8.5.0
Un oggetto che può essere utilizzato per raccogliere metriche sulle performance dall'istanza Node.js corrente. È simile a window.performance
nei browser.
performance.clearMarks([name])
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v8.5.0 | Aggiunto in: v8.5.0 |
name
<stringa>
Se name
non viene fornito, rimuove tutti gli oggetti PerformanceMark
dalla Timeline delle Performance. Se viene fornito name
, rimuove solo il contrassegno con il nome specificato.
performance.clearMeasures([name])
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v16.7.0 | Aggiunto in: v16.7.0 |
name
<stringa>
Se name
non viene fornito, rimuove tutti gli oggetti PerformanceMeasure
dalla Timeline delle Performance. Se viene fornito name
, rimuove solo la misurazione con il nome specificato.
performance.clearResourceTimings([name])
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
name
<stringa>
Se name
non viene fornito, rimuove tutti gli oggetti PerformanceResourceTiming
dalla Timeline delle Risorse. Se viene fornito name
, rimuove solo la risorsa con il nome specificato.
performance.eventLoopUtilization([utilization1[, utilization2]])
Aggiunto in: v14.10.0, v12.19.0
utilization1
<Oggetto> Il risultato di una chiamata precedente aeventLoopUtilization()
.utilization2
<Oggetto> Il risultato di una chiamata precedente aeventLoopUtilization()
precedente autilization1
.- Restituisce: <Oggetto>
Il metodo eventLoopUtilization()
restituisce un oggetto che contiene la durata cumulativa del tempo in cui il ciclo degli eventi è stato sia inattivo che attivo come timer in millisecondi ad alta risoluzione. Il valore di utilization
è l'utilizzo calcolato del ciclo degli eventi (ELU).
Se il bootstrapping non è ancora terminato nel thread principale, le proprietà hanno il valore di 0
. L'ELU è immediatamente disponibile sui thread Worker poiché il bootstrap avviene all'interno del ciclo degli eventi.
Sia utilization1
che utilization2
sono parametri opzionali.
Se viene passato utilization1
, viene calcolato e restituito il delta tra i tempi active
e idle
della chiamata corrente, nonché il valore utilization
corrispondente (simile a process.hrtime()
).
Se vengono passati sia utilization1
che utilization2
, il delta viene calcolato tra i due argomenti. Questa è un'opzione di convenienza perché, a differenza di process.hrtime()
, il calcolo dell'ELU è più complesso di una singola sottrazione.
L'ELU è simile all'utilizzo della CPU, tranne per il fatto che misura solo le statistiche del ciclo degli eventi e non l'utilizzo della CPU. Rappresenta la percentuale di tempo in cui il ciclo degli eventi ha trascorso al di fuori del provider di eventi del ciclo degli eventi (ad es. epoll_wait
). Non viene preso in considerazione nessun altro tempo di inattività della CPU. Quello che segue è un esempio di come un processo per lo più inattivo avrà un ELU elevato.
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)
})
Sebbene la CPU sia per lo più inattiva durante l'esecuzione di questo script, il valore di utilization
è 1
. Questo perché la chiamata a child_process.spawnSync()
impedisce al ciclo degli eventi di procedere.
Passare un oggetto definito dall'utente anziché il risultato di una chiamata precedente a eventLoopUtilization()
porterà a un comportamento indefinito. Non è garantito che i valori restituiti riflettano alcuno stato corretto del ciclo degli eventi.
performance.getEntries()
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v16.7.0 | Aggiunto in: v16.7.0 |
- Restituisce: <PerformanceEntry[]>
Restituisce un elenco di oggetti PerformanceEntry
in ordine cronologico rispetto a performanceEntry.startTime
. Se si è interessati solo alle voci di performance di determinati tipi o che hanno determinati nomi, vedere performance.getEntriesByType()
e performance.getEntriesByName()
.
performance.getEntriesByName(name[, type])
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v16.7.0 | Aggiunto in: v16.7.0 |
name
<string>type
<string>- Restituisce: <PerformanceEntry[]>
Restituisce un elenco di oggetti PerformanceEntry
in ordine cronologico rispetto a performanceEntry.startTime
il cui performanceEntry.name
è uguale a name
e, facoltativamente, il cui performanceEntry.entryType
è uguale a type
.
performance.getEntriesByType(type)
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v16.7.0 | Aggiunto in: v16.7.0 |
type
<string>- Restituisce: <PerformanceEntry[]>
Restituisce un elenco di oggetti PerformanceEntry
in ordine cronologico rispetto a performanceEntry.startTime
il cui performanceEntry.entryType
è uguale a type
.
performance.mark(name[, options])
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. L'argomento name non è più opzionale. |
v16.0.0 | Aggiornato per conformarsi alla specifica User Timing Level 3. |
v8.5.0 | Aggiunto in: v8.5.0 |
Crea una nuova voce PerformanceMark
nella Performance Timeline. Un PerformanceMark
è una sottoclasse di PerformanceEntry
il cui performanceEntry.entryType
è sempre 'mark'
e il cui performanceEntry.duration
è sempre 0
. I segni di performance vengono utilizzati per contrassegnare momenti specifici significativi nella Performance Timeline.
La voce PerformanceMark
creata viene inserita nella Performance Timeline globale e può essere interrogata con performance.getEntries
, performance.getEntriesByName
e performance.getEntriesByType
. Quando viene eseguita l'osservazione, le voci devono essere cancellate dalla Performance Timeline globale manualmente con performance.clearMarks
.
performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, global, cacheMode, bodyInfo, responseStatus[, deliveryType])
[Cronologia]
Versione | Modifiche |
---|---|
v22.2.0 | Aggiunti gli argomenti bodyInfo, responseStatus e deliveryType. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
timingInfo
<Object> Informazioni sul timing FetchrequestedUrl
<string> L'url della risorsainitiatorType
<string> Il nome dell'iniziatore, ad es.: 'fetch'global
<Object>cacheMode
<string> La modalità cache deve essere una stringa vuota ('') o 'local'bodyInfo
<Object> Informazioni sul corpo della risposta FetchresponseStatus
<number> Il codice di stato della rispostadeliveryType
<string> Il tipo di consegna. Predefinito:''
.
Questa proprietà è un'estensione di Node.js. Non è disponibile nei browser Web.
Crea una nuova voce PerformanceResourceTiming
nella Timeline delle Risorse. PerformanceResourceTiming
è una sottoclasse di PerformanceEntry
la cui performanceEntry.entryType
è sempre 'resource'
. Le risorse di performance vengono utilizzate per contrassegnare i momenti nella Timeline delle Risorse.
La voce PerformanceMark
creata viene inserita nella Timeline delle Risorse globale e può essere interrogata con performance.getEntries
, performance.getEntriesByName
e performance.getEntriesByType
. Quando l'osservazione viene eseguita, le voci devono essere cancellate dalla Timeline delle Performance globale manualmente con performance.clearResourceTimings
.
performance.measure(name[, startMarkOrOptions[, endMark]])
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v16.0.0 | Aggiornato per essere conforme alla specifica User Timing Level 3. |
v13.13.0, v12.16.3 | I parametri startMark e endMark sono resi opzionali. |
v8.5.0 | Aggiunto in: v8.5.0 |
name
<string>startMarkOrOptions
<string> | <Object> Opzionale.detail
<any> Dettaglio opzionale aggiuntivo da includere nella misurazione.duration
<number> Durata tra l'ora di inizio e quella di fine.end
<number> | <string> Timestamp da utilizzare come ora di fine, oppure una stringa che identifica un segno precedentemente registrato.start
<number> | <string> Timestamp da utilizzare come ora di inizio, oppure una stringa che identifica un segno precedentemente registrato.
endMark
<string> Opzionale. Deve essere omesso sestartMarkOrOptions
è un <Object>.
Crea una nuova voce PerformanceMeasure
nella Performance Timeline. Una PerformanceMeasure
è una sottoclasse di PerformanceEntry
il cui performanceEntry.entryType
è sempre 'measure'
e la cui performanceEntry.duration
misura il numero di millisecondi trascorsi tra startMark
e endMark
.
L'argomento startMark
può identificare qualsiasi PerformanceMark
esistente nella Performance Timeline, oppure può identificare qualsiasi delle proprietà timestamp fornite dalla classe PerformanceNodeTiming
. Se il startMark
specificato non esiste, viene generato un errore.
L'argomento opzionale endMark
deve identificare qualsiasi PerformanceMark
esistente nella Performance Timeline o qualsiasi delle proprietà timestamp fornite dalla classe PerformanceNodeTiming
. Se non viene passato alcun parametro, endMark
sarà performance.now()
, altrimenti se il endMark
specificato non esiste, verrà generato un errore.
La voce PerformanceMeasure
creata viene inserita nella Performance Timeline globale e può essere interrogata con performance.getEntries
, performance.getEntriesByName
e performance.getEntriesByType
. Quando viene eseguita l'osservazione, le voci devono essere cancellate manualmente dalla Performance Timeline globale con performance.clearMeasures
.
performance.nodeTiming
Aggiunto in: v8.5.0
Questa proprietà è un'estensione di Node.js. Non è disponibile nei browser web.
Un'istanza della classe PerformanceNodeTiming
che fornisce metriche di performance per specifiche pietre miliari operative di Node.js.
performance.now()
[Cronologia]
Versione | Cambiamenti |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v8.5.0 | Aggiunto in: v8.5.0 |
- Restituisce: <number>
Restituisce l'attuale timestamp in millisecondi ad alta risoluzione, dove 0 rappresenta l'inizio dell'attuale processo node
.
performance.setResourceTimingBufferSize(maxSize)
[Cronologia]
Versione | Cambiamenti |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v18.8.0 | Aggiunto in: v18.8.0 |
Imposta la dimensione globale del buffer di temporizzazione delle risorse di performance al numero specificato di oggetti di inserimento delle performance di tipo "risorsa".
Per impostazione predefinita, la dimensione massima del buffer è impostata a 250.
performance.timeOrigin
Aggiunto in: v8.5.0
Il timeOrigin
specifica il timestamp in millisecondi ad alta risoluzione al quale è iniziato l'attuale processo node
, misurato in tempo Unix.
performance.timerify(fn[, options])
[Cronologia]
Versione | Cambiamenti |
---|---|
v16.0.0 | Aggiunta l'opzione istogramma. |
v16.0.0 | Re-implementato per utilizzare pure-JavaScript e la capacità di cronometrare le funzioni asincrone. |
v8.5.0 | Aggiunto in: v8.5.0 |
fn
<Function>options
<Object>histogram
<RecordableHistogram> Un oggetto istogramma creato utilizzandoperf_hooks.createHistogram()
che registrerà le durate di runtime in nanosecondi.
Questa proprietà è un'estensione di Node.js. Non è disponibile nei browser web.
Avvolge una funzione all'interno di una nuova funzione che misura il tempo di esecuzione della funzione avvolta. Un PerformanceObserver
deve essere sottoscritto al tipo di evento 'function'
affinché i dettagli di temporizzazione siano accessibili.
import { performance, PerformanceObserver } from 'node:perf_hooks'
function someFunction() {
console.log('hello world')
}
const wrapped = performance.timerify(someFunction)
const obs = new PerformanceObserver(list => {
console.log(list.getEntries()[0].duration)
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'] })
// Verrà creato un inserimento della timeline delle performance
wrapped()
const { performance, PerformanceObserver } = require('node:perf_hooks')
function someFunction() {
console.log('hello world')
}
const wrapped = performance.timerify(someFunction)
const obs = new PerformanceObserver(list => {
console.log(list.getEntries()[0].duration)
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'] })
// Verrà creato un inserimento della timeline delle performance
wrapped()
Se la funzione avvolta restituisce una promessa, verrà allegato un gestore finally alla promessa e la durata verrà segnalata una volta invocato il gestore finally.
performance.toJSON()
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto performance come ricevitore. |
v16.1.0 | Aggiunto in: v16.1.0 |
Un oggetto che è una rappresentazione JSON dell'oggetto performance
. È simile a window.performance.toJSON
nei browser.
Evento: 'resourcetimingbufferfull'
Aggiunto in: v18.8.0
L'evento 'resourcetimingbufferfull'
viene attivato quando il buffer globale di tempistica delle risorse delle prestazioni è pieno. Regola la dimensione del buffer di tempistica delle risorse con performance.setResourceTimingBufferSize()
o cancella il buffer con performance.clearResourceTimings()
nel listener dell'evento per consentire l'aggiunta di più voci al buffer della timeline delle prestazioni.
Classe: PerformanceEntry
Aggiunto in: v8.5.0
Il costruttore di questa classe non è esposto direttamente agli utenti.
performanceEntry.duration
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceEntry come ricevitore. |
v8.5.0 | Aggiunto in: v8.5.0 |
Il numero totale di millisecondi trascorsi per questa voce. Questo valore non sarà significativo per tutti i tipi di Performance Entry.
performanceEntry.entryType
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceEntry come ricevitore. |
v8.5.0 | Aggiunto in: v8.5.0 |
Il tipo della voce di performance. Può essere uno dei seguenti:
'dns'
(solo Node.js)'function'
(solo Node.js)'gc'
(solo Node.js)'http2'
(solo Node.js)'http'
(solo Node.js)'mark'
(disponibile sul Web)'measure'
(disponibile sul Web)'net'
(solo Node.js)'node'
(solo Node.js)'resource'
(disponibile sul Web)
performanceEntry.name
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceEntry come ricevitore. |
v8.5.0 | Aggiunto in: v8.5.0 |
Il nome della voce di performance.
performanceEntry.startTime
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceEntry come ricevitore. |
v8.5.0 | Aggiunto in: v8.5.0 |
Il timestamp ad alta risoluzione in millisecondi che indica l'orario di inizio della Voce di Performance.
Classe: PerformanceMark
Aggiunto in: v18.2.0, v16.17.0
- Estende: <PerformanceEntry>
Espone i contrassegni creati tramite il metodo Performance.mark()
.
performanceMark.detail
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceMark come ricevitore. |
v16.0.0 | Aggiunto in: v16.0.0 |
Dettagli aggiuntivi specificati durante la creazione con il metodo Performance.mark()
.
Classe: PerformanceMeasure
Aggiunto in: v18.2.0, v16.17.0
- Estende: <PerformanceEntry>
Espone le misurazioni create tramite il metodo Performance.measure()
.
Il costruttore di questa classe non è esposto direttamente agli utenti.
performanceMeasure.detail
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceMeasure come ricevitore. |
v16.0.0 | Aggiunto in: v16.0.0 |
Dettagli aggiuntivi specificati durante la creazione con il metodo Performance.measure()
.
Classe: PerformanceNodeEntry
Aggiunto in: v19.0.0
- Estende: <PerformanceEntry>
Questa classe è un'estensione di Node.js. Non è disponibile nei browser Web.
Fornisce dati temporali dettagliati di Node.js.
Il costruttore di questa classe non è esposto direttamente agli utenti.
performanceNodeEntry.detail
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceNodeEntry come ricevitore. |
v16.0.0 | Aggiunto in: v16.0.0 |
Dettagli aggiuntivi specifici per entryType
.
performanceNodeEntry.flags
[Cronologia]
Versione | Modifiche |
---|---|
v16.0.0 | Deprecato a runtime. Ora spostato nella proprietà detail quando entryType è 'gc'. |
v13.9.0, v12.17.0 | Aggiunto in: v13.9.0, v12.17.0 |
[Stabile: 0 - Deprecato]
Stabile: 0 Stabilità: 0 - Deprecato: Utilizzare invece performanceNodeEntry.detail
.
Quando performanceEntry.entryType
è uguale a 'gc'
, la proprietà performance.flags
contiene informazioni aggiuntive sull'operazione di garbage collection. Il valore può essere uno dei seguenti:
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
[Cronologia]
Versione | Modifiche |
---|---|
v16.0.0 | Deprecato a runtime. Ora spostato nella proprietà detail quando entryType è 'gc'. |
v8.5.0 | Aggiunto in: v8.5.0 |
[Stabile: 0 - Deprecato]
Stabile: 0 Stabilità: 0 - Deprecato: Utilizzare invece performanceNodeEntry.detail
.
Quando performanceEntry.entryType
è uguale a 'gc'
, la proprietà performance.kind
identifica il tipo di operazione di garbage collection che si è verificata. Il valore può essere uno dei seguenti:
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
Dettagli sulla Raccolta dei Rifiuti ('gc')
Quando performanceEntry.type
è uguale a 'gc'
, la proprietà performanceNodeEntry.detail
sarà un <Oggetto> con due proprietà:
kind
<numero> Uno tra: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
<numero> Uno tra: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
Dettagli HTTP ('http')
Quando performanceEntry.type
è uguale a 'http'
, la proprietà performanceNodeEntry.detail
sarà un <Oggetto> contenente informazioni aggiuntive.
Se performanceEntry.name
è uguale a HttpClient
, il detail
conterrà le seguenti proprietà: req
, res
. E la proprietà req
sarà un <Oggetto> contenente method
, url
, headers
, la proprietà res
sarà un <Oggetto> contenente statusCode
, statusMessage
, headers
.
Se performanceEntry.name
è uguale a HttpRequest
, il detail
conterrà le seguenti proprietà: req
, res
. E la proprietà req
sarà un <Oggetto> contenente method
, url
, headers
, la proprietà res
sarà un <Oggetto> contenente statusCode
, statusMessage
, headers
.
Questo potrebbe aggiungere un sovraccarico di memoria aggiuntivo e dovrebbe essere utilizzato solo per scopi diagnostici, non lasciato attivo in produzione per impostazione predefinita.
Dettagli HTTP/2 ('http2')
Quando performanceEntry.type
è uguale a 'http2'
, la proprietà performanceNodeEntry.detail
sarà un <Object> contenente informazioni aggiuntive sulle prestazioni.
Se performanceEntry.name
è uguale a Http2Stream
, il detail
conterrà le seguenti proprietà:
bytesRead
<number> Il numero di byte del frameDATA
ricevuti per questoHttp2Stream
.bytesWritten
<number> Il numero di byte del frameDATA
inviati per questoHttp2Stream
.id
<number> L'identificatore dell'oggettoHttp2Stream
associato.timeToFirstByte
<number> Il numero di millisecondi trascorsi trastartTime
diPerformanceEntry
e la ricezione del primo frameDATA
.timeToFirstByteSent
<number> Il numero di millisecondi trascorsi trastartTime
diPerformanceEntry
e l'invio del primo frameDATA
.timeToFirstHeader
<number> Il numero di millisecondi trascorsi trastartTime
diPerformanceEntry
e la ricezione del primo header.
Se performanceEntry.name
è uguale a Http2Session
, il detail
conterrà le seguenti proprietà:
bytesRead
<number> Il numero di byte ricevuti per questaHttp2Session
.bytesWritten
<number> Il numero di byte inviati per questaHttp2Session
.framesReceived
<number> Il numero di frame HTTP/2 ricevuti dallaHttp2Session
.framesSent
<number> Il numero di frame HTTP/2 inviati dallaHttp2Session
.maxConcurrentStreams
<number> Il numero massimo di stream aperti in contemporanea durante la durata dellaHttp2Session
.pingRTT
<number> Il numero di millisecondi trascorsi tra l'invio di un framePING
e la ricezione del suo acknowledgement. Presente solo se è stato inviato un framePING
sullaHttp2Session
.streamAverageDuration
<number> La durata media (in millisecondi) per tutte le istanzeHttp2Stream
.streamCount
<number> Il numero di istanzeHttp2Stream
elaborate dallaHttp2Session
.type
<string> Sia'server'
che'client'
per identificare il tipo diHttp2Session
.
Dettagli di Timerify ('function')
Quando performanceEntry.type
è uguale a 'function'
, la proprietà performanceNodeEntry.detail
sarà un <Array> che elenca gli argomenti di input alla funzione misurata.
Dettagli di Net ('net')
Quando performanceEntry.type
è uguale a 'net'
, la proprietà performanceNodeEntry.detail
sarà un <Object> contenente informazioni aggiuntive.
Se performanceEntry.name
è uguale a connect
, detail
conterrà le seguenti proprietà: host
, port
.
Dettagli di DNS ('dns')
Quando performanceEntry.type
è uguale a 'dns'
, la proprietà performanceNodeEntry.detail
sarà un <Object> contenente informazioni aggiuntive.
Se performanceEntry.name
è uguale a lookup
, detail
conterrà le seguenti proprietà: hostname
, family
, hints
, verbatim
, addresses
.
Se performanceEntry.name
è uguale a lookupService
, detail
conterrà le seguenti proprietà: host
, port
, hostname
, service
.
Se performanceEntry.name
è uguale a queryxxx
o getHostByAddr
, detail
conterrà le seguenti proprietà: host
, ttl
, result
. Il valore di result
è lo stesso del risultato di queryxxx
o getHostByAddr
.
Classe: PerformanceNodeTiming
Aggiunto in: v8.5.0
- Estensioni: <PerformanceEntry>
Questa proprietà è un'estensione di Node.js. Non è disponibile nei browser Web.
Fornisce dettagli di tempistica per Node.js stesso. Il costruttore di questa classe non è esposto agli utenti.
performanceNodeTiming.bootstrapComplete
Aggiunto in: v8.5.0
Il timestamp in millisecondi ad alta risoluzione in cui il processo Node.js ha completato il bootstrap. Se il bootstrap non è ancora terminato, la proprietà ha il valore -1.
performanceNodeTiming.environment
Aggiunto in: v8.5.0
Timestamp in millisecondi ad alta risoluzione in cui è stato inizializzato l'ambiente Node.js.
performanceNodeTiming.idleTime
Aggiunto in: v14.10.0, v12.19.0
Timestamp in millisecondi ad alta risoluzione della quantità di tempo in cui il loop degli eventi è stato inattivo all'interno del provider di eventi del loop degli eventi (ad esempio, epoll_wait
). Questo non tiene conto dell'utilizzo della CPU. Se il loop degli eventi non è ancora stato avviato (ad esempio, nel primo tick dello script principale), la proprietà ha il valore 0.
performanceNodeTiming.loopExit
Aggiunto in: v8.5.0
Timestamp in millisecondi ad alta risoluzione in cui il loop degli eventi Node.js è terminato. Se il loop degli eventi non è ancora terminato, la proprietà ha il valore -1. Può avere un valore diverso da -1 solo in un gestore dell'evento 'exit'
.
performanceNodeTiming.loopStart
Aggiunto in: v8.5.0
Timestamp in millisecondi ad alta risoluzione in cui è stato avviato il loop degli eventi Node.js. Se il loop degli eventi non è ancora stato avviato (ad esempio, nel primo tick dello script principale), la proprietà ha il valore -1.
performanceNodeTiming.nodeStart
Aggiunto in: v8.5.0
Timestamp in millisecondi ad alta risoluzione in cui è stato inizializzato il processo Node.js.
performanceNodeTiming.uvMetricsInfo
Aggiunto in: v22.8.0, v20.18.0
- Restituisce: <Object>
Questo è un wrapper per la funzione uv_metrics_info
. Restituisce il set corrente di metriche del loop degli eventi.
Si consiglia di utilizzare questa proprietà all'interno di una funzione la cui esecuzione è stata pianificata usando setImmediate
per evitare di raccogliere metriche prima di aver completato tutte le operazioni pianificate durante l'iterazione corrente del loop.
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
Aggiunto in: v8.5.0
Timestamp in millisecondi ad alta risoluzione in cui è stata inizializzata la piattaforma V8.
Classe: PerformanceResourceTiming
Aggiunto in: v18.2.0, v16.17.0
- Estensione di: <PerformanceEntry>
Fornisce dati temporali di rete dettagliati riguardanti il caricamento delle risorse di un'applicazione.
Il costruttore di questa classe non è direttamente esposto agli utenti.
performanceResourceTiming.workerStart
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione immediatamente prima della spedizione della richiesta fetch
. Se la risorsa non viene intercettata da un worker, la proprietà restituirà sempre 0.
performanceResourceTiming.redirectStart
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione che rappresenta l'ora di inizio del fetch che avvia il reindirizzamento.
performanceResourceTiming.redirectEnd
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione che verrà creato immediatamente dopo aver ricevuto l'ultimo byte della risposta dell'ultimo reindirizzamento.
performanceResourceTiming.fetchStart
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione immediatamente prima che Node.js inizi a recuperare la risorsa.
performanceResourceTiming.domainLookupStart
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione immediatamente prima che Node.js inizi la ricerca del nome di dominio per la risorsa.
performanceResourceTiming.domainLookupEnd
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione che rappresenta il tempo immediatamente dopo che Node.js ha completato la ricerca del nome di dominio per la risorsa.
performanceResourceTiming.connectStart
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione che rappresenta il tempo immediatamente prima che Node.js inizi a stabilire la connessione con il server per recuperare la risorsa.
performanceResourceTiming.connectEnd
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione che rappresenta il tempo immediatamente dopo che Node.js ha completato l'instaurazione della connessione con il server per recuperare la risorsa.
performanceResourceTiming.secureConnectionStart
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione che rappresenta il tempo immediatamente prima che Node.js inizi il processo di handshake per proteggere la connessione corrente.
performanceResourceTiming.requestStart
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione che rappresenta il tempo immediatamente prima che Node.js riceva il primo byte della risposta dal server.
performanceResourceTiming.responseEnd
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Timestamp in millisecondi ad alta risoluzione che rappresenta il tempo immediatamente dopo che Node.js riceve l'ultimo byte della risorsa o immediatamente prima che la connessione di trasporto venga chiusa, a seconda di quale evento si verifica per primo.
performanceResourceTiming.transferSize
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Un numero che rappresenta la dimensione (in ottetti) della risorsa recuperata. La dimensione include i campi dell'intestazione di risposta più il corpo del payload di risposta.
performanceResourceTiming.encodedBodySize
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Un numero che rappresenta la dimensione (in ottetti) ricevuta dal recupero (HTTP o cache), del corpo del payload, prima di rimuovere qualsiasi codifica del contenuto applicata.
performanceResourceTiming.decodedBodySize
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo getter di proprietà deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Un numero che rappresenta la dimensione (in ottetti) ricevuta dal recupero (HTTP o cache), del corpo del messaggio, dopo aver rimosso qualsiasi codifica del contenuto applicata.
performanceResourceTiming.toJSON()
[Cronologia]
Versione | Modifiche |
---|---|
v19.0.0 | Questo metodo deve essere chiamato con l'oggetto PerformanceResourceTiming come ricevente. |
v18.2.0, v16.17.0 | Aggiunto in: v18.2.0, v16.17.0 |
Restituisce un oggetto
che è la rappresentazione JSON dell'oggetto PerformanceResourceTiming
Classe: PerformanceObserver
Aggiunto in: v8.5.0
PerformanceObserver.supportedEntryTypes
Aggiunto in: v16.0.0
Ottieni i tipi supportati.
new PerformanceObserver(callback)
[Cronologia]
Versione | Modifiche |
---|---|
v18.0.0 | Il passaggio di un callback non valido all'argomento callback ora genera ERR_INVALID_ARG_TYPE invece di ERR_INVALID_CALLBACK . |
v8.5.0 | Aggiunto in: v8.5.0 |
callback
<Funzione>list
<PerformanceObserverEntryList>observer
<PerformanceObserver>
Gli oggetti PerformanceObserver
forniscono notifiche quando nuove istanze PerformanceEntry
sono state aggiunte alla Timeline delle Performance.
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')
Poiché le istanze PerformanceObserver
introducono un ulteriore sovraccarico di prestazioni, le istanze non devono rimanere sottoscritte alle notifiche indefinitamente. Gli utenti dovrebbero disconnettere gli osservatori non appena non sono più necessari.
Il callback
viene invocato quando un PerformanceObserver
viene notificato di nuove istanze PerformanceEntry
. Il callback riceve un'istanza PerformanceObserverEntryList
e un riferimento a PerformanceObserver
.
performanceObserver.disconnect()
Aggiunto in: v8.5.0
Disconnette l'istanza PerformanceObserver
da tutte le notifiche.
performanceObserver.observe(options)
[Cronologia]
Versione | Modifiche |
---|---|
v16.7.0 | Aggiornato per conformarsi a Performance Timeline Level 2. L'opzione buffered è stata aggiunta. |
v16.0.0 | Aggiornato per conformarsi a User Timing Level 3. L'opzione buffered è stata rimossa. |
v8.5.0 | Aggiunto in: v8.5.0 |
options
<Oggetto>type
<stringa> Un singolo tipo <PerformanceEntry>. Non deve essere specificato seentryTypes
è già specificato.entryTypes
<stringa[]> Una matrice di stringhe che identificano i tipi di istanze <PerformanceEntry> a cui l'osservatore è interessato. Se non fornito, verrà generato un errore.buffered
<booleano> Se vero, la callback dell'osservatore viene chiamata con un elenco di vociPerformanceEntry
memorizzate nella cache a livello globale. Se falso, solo le vociPerformanceEntry
create dopo il punto temporale vengono inviate alla callback dell'osservatore. Predefinito:false
.
Iscrive l'istanza <PerformanceObserver> alle notifiche di nuove istanze <PerformanceEntry> identificate da options.entryTypes
o options.type
:
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((list, observer) => {
// Chiamato una volta in modo asincrono. `list` contiene tre elementi.
})
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) => {
// Chiamato una volta in modo asincrono. `list` contiene tre elementi.
})
obs.observe({ type: 'mark' })
for (let n = 0; n < 3; n++) performance.mark(`test${n}`)
performanceObserver.takeRecords()
Aggiunto in: v16.0.0
- Restituisce: <PerformanceEntry[]> Elenco corrente delle voci memorizzate nell'osservatore delle prestazioni, svuotandolo.
Classe: PerformanceObserverEntryList
Aggiunto in: v8.5.0
La classe PerformanceObserverEntryList
viene utilizzata per fornire accesso alle istanze PerformanceEntry
passate a un PerformanceObserver
. Il costruttore di questa classe non è esposto agli utenti.
performanceObserverEntryList.getEntries()
Aggiunto in: v8.5.0
- Restituisce: <PerformanceEntry[]>
Restituisce un elenco di oggetti PerformanceEntry
in ordine cronologico rispetto 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])
Aggiunto in: v8.5.0
name
<string>type
<string>- Restituisce: <PerformanceEntry[]>
Restituisce un elenco di oggetti PerformanceEntry
in ordine cronologico rispetto a performanceEntry.startTime
il cui performanceEntry.name
è uguale a name
, e facoltativamente, il cui performanceEntry.entryType
è uguale 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)
Aggiunto in: v8.5.0
type
<string>- Restituisce: <PerformanceEntry[]>
Restituisce un elenco di oggetti PerformanceEntry
in ordine cronologico rispetto a performanceEntry.startTime
il cui performanceEntry.entryType
è uguale 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])
Aggiunto in: v15.9.0, v14.18.0
options
<Object>lowest
<number> | <bigint> Il valore più basso distinguibile. Deve essere un valore intero maggiore di 0. Predefinito:1
.highest
<number> | <bigint> Il valore più alto registrato. Deve essere un valore intero uguale o maggiore di due voltelowest
. Predefinito:Number.MAX_SAFE_INTEGER
.figures
<number> Il numero di cifre di precisione. Deve essere un numero compreso tra1
e5
. Predefinito:3
.
Restituisce: <RecordableHistogram>
Restituisce un <RecordableHistogram>.
perf_hooks.monitorEventLoopDelay([options])
Aggiunto in: v11.10.0
options
<Object>resolution
<number> La frequenza di campionamento in millisecondi. Deve essere maggiore di zero. Default:10
.
Restituisce: <IntervalHistogram>
Questa proprietà è un'estensione di Node.js. Non è disponibile nei browser Web.
Crea un oggetto IntervalHistogram
che campionata e riporta il ritardo del loop degli eventi nel tempo. I ritardi saranno riportati in nanosecondi.
L'utilizzo di un timer per rilevare il ritardo approssimativo del loop degli eventi funziona perché l'esecuzione dei timer è legata specificamente al ciclo di vita del loop degli eventi libuv. Cioè, un ritardo nel loop causerà un ritardo nell'esecuzione del timer, e questi ritardi sono specificatamente ciò che questa API intende rilevare.
import { monitorEventLoopDelay } from 'node:perf_hooks'
const h = monitorEventLoopDelay({ resolution: 20 })
h.enable()
// Fai qualcosa.
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()
// Fai qualcosa.
h.disable()
console.log(h.min)
console.log(h.max)
console.log(h.mean)
console.log(h.stddev)
console.log(h.percentiles)
console.log(h.percentile(50))
console.log(h.percentile(99))
Class: Histogram
Aggiunto in: v11.10.0
histogram.count
Aggiunto in: v17.4.0, v16.14.0
Il numero di campioni registrati dall'istogramma.
histogram.countBigInt
Aggiunto in: v17.4.0, v16.14.0
Il numero di campioni registrati dall'istogramma.
histogram.exceeds
Aggiunto in: v11.10.0
Il numero di volte in cui il ritardo del loop degli eventi ha superato la soglia massima di ritardo del loop degli eventi di 1 ora.
histogram.exceedsBigInt
Aggiunto in: v17.4.0, v16.14.0
Il numero di volte in cui il ritardo del loop degli eventi ha superato la soglia massima di ritardo del loop degli eventi di 1 ora.
histogram.max
Aggiunto in: v11.10.0
Il ritardo massimo del loop degli eventi registrato.
histogram.maxBigInt
Aggiunto in: v17.4.0, v16.14.0
Il ritardo massimo del loop degli eventi registrato.
histogram.mean
Aggiunto in: v11.10.0
La media dei ritardi del loop degli eventi registrati.
histogram.min
Aggiunto in: v11.10.0
Il ritardo minimo del loop degli eventi registrato.
histogram.minBigInt
Aggiunto in: v17.4.0, v16.14.0
Il ritardo minimo del loop degli eventi registrato.
histogram.percentile(percentile)
Aggiunto in: v11.10.0
Restituisce il valore alla percentuale specificata.
histogram.percentileBigInt(percentile)
Aggiunto in: v17.4.0, v16.14.0
Restituisce il valore alla percentuale specificata.
histogram.percentiles
Aggiunto in: v11.10.0
Restituisce un oggetto Map
che dettaglia la distribuzione delle percentuali accumulate.
histogram.percentilesBigInt
Aggiunto in: v17.4.0, v16.14.0
Restituisce un oggetto Map
che dettaglia la distribuzione delle percentuali accumulate.
histogram.reset()
Aggiunto in: v11.10.0
Reimposta i dati dell'istogramma raccolti.
histogram.stddev
Aggiunto in: v11.10.0
La deviazione standard dei ritardi del loop degli eventi registrati.
Classe: IntervalHistogram extends Histogram
Un Histogram
che viene aggiornato periodicamente a un dato intervallo.
histogram.disable()
Aggiunto in: v11.10.0
- Restituisce: <boolean>
Disabilita il timer dell'intervallo di aggiornamento. Restituisce true
se il timer è stato arrestato, false
se era già arrestato.
histogram.enable()
Aggiunto in: v11.10.0
- Restituisce: <boolean>
Abilita il timer dell'intervallo di aggiornamento. Restituisce true
se il timer è stato avviato, false
se era già avviato.
Clonazione di un IntervalHistogram
Le istanze di <IntervalHistogram> possono essere clonate tramite <MessagePort>. Sul lato ricevente, l'istogramma viene clonato come un semplice oggetto <Histogram> che non implementa i metodi enable()
e disable()
.
Classe: RecordableHistogram extends Histogram
Aggiunto in: v15.9.0, v14.18.0
histogram.add(other)
Aggiunto in: v17.4.0, v16.14.0
other
<RecordableHistogram>
Aggiunge i valori da other
a questo istogramma.
histogram.record(val)
Aggiunto in: v15.9.0, v14.18.0
histogram.recordDelta()
Aggiunto in: v15.9.0, v14.18.0
Calcola la quantità di tempo (in nanosecondi) trascorso dalla chiamata precedente a recordDelta()
e registra tale quantità nell'istogramma.
Esempi
Misurazione della durata delle operazioni asincrone
L'esempio seguente utilizza le Async Hooks e le API Performance per misurare la durata effettiva di un'operazione Timeout (inclusa la quantità di tempo impiegata per eseguire la callback).
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)
Misurare il tempo di caricamento delle dipendenze
L'esempio seguente misura la durata delle operazioni require()
per caricare le dipendenze:
import { performance, PerformanceObserver } from 'node:perf_hooks'
// Attiva l'osservatore
const obs = new PerformanceObserver(list => {
const entries = list.getEntries()
entries.forEach(entry => {
console.log(`import('${entry[0]}')`, entry.duration)
})
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'], buffered: true })
const timedImport = performance.timerify(async module => {
return await import(module)
})
await timedImport('some-module')
'use strict'
const { performance, PerformanceObserver } = require('node:perf_hooks')
const mod = require('node:module')
// Monkey patch della funzione require
mod.Module.prototype.require = performance.timerify(mod.Module.prototype.require)
require = performance.timerify(require)
// Attiva l'osservatore
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')
Misurare il tempo di un round-trip HTTP
L'esempio seguente viene utilizzato per tracciare il tempo impiegato dal client HTTP (OutgoingMessage
) e dalla richiesta HTTP (IncomingMessage
). Per il client HTTP, significa l'intervallo di tempo tra l'inizio della richiesta e la ricezione della risposta, e per la richiesta HTTP, significa l'intervallo di tempo tra la ricezione della richiesta e l'invio della risposta:
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}`)
})
Misurare il tempo impiegato da net.connect
(solo per TCP) quando la connessione ha successo
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)
})
Misurare il tempo impiegato dal DNS quando la richiesta ha successo
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')