perf_hooks
This module provides an implementation of a subset of the W3C Web Performance APIs as well as additional APIs for Node.js-specific performance measurements.
Node.js supports the following Web Performance APIs:
import { PerformanceObserver, performance } from 'node:perf_hooks';
const obs = new PerformanceObserver((items) => {
console.log(items.getEntries()[0].duration);
performance.clearMarks();
});
obs.observe({ type: 'measure' });
performance.measure('Start to Now');
performance.mark('A');
doSomeLongRunningProcess(() => {
performance.measure('A to Now', 'A');
performance.mark('B');
performance.measure('A to B', 'A', 'B');
});
Usage in Deno
import * as mod from "node:perf_hooks";
Classes
This property is an extension by Node.js. It is not available in Web browsers.
Provides detailed network timing data regarding the loading of an application's resources.
Functions
Interfaces
Namespaces
Type Aliases
Variables
class PerformanceEntry
Usage in Deno
import { PerformanceEntry } from "node:perf_hooks";
The constructor of this class is not exposed to users directly.
Constructors #
#PerformanceEntry() Properties #
The total number of milliseconds elapsed for this entry. This value will not be meaningful for all Performance Entry types.
The type of the performance entry. It may be one of:
'node'(Node.js only)'mark'(available on the Web)'measure'(available on the Web)'gc'(Node.js only)'function'(Node.js only)'http2'(Node.js only)'http'(Node.js only)
Methods #
variable PerformanceEntry
class PerformanceMark
Usage in Deno
import { PerformanceMark } from "node:perf_hooks";
variable PerformanceMark
class PerformanceMeasure
Usage in Deno
import { PerformanceMeasure } from "node:perf_hooks";
variable PerformanceMeasure
class PerformanceNodeTiming
Usage in Deno
import { PerformanceNodeTiming } from "node:perf_hooks";
This property is an extension by Node.js. It is not available in Web browsers.
Provides timing details for Node.js itself. The constructor of this class is not exposed to users.
Properties #
#bootstrapComplete: number The high resolution millisecond timestamp at which the Node.js process completed bootstrapping. If bootstrapping has not yet finished, the property has the value of -1.
#environment: number The high resolution millisecond timestamp at which the Node.js environment was initialized.
The high resolution millisecond timestamp of the amount of time the event loop
has been idle within the event loop's event provider (e.g. epoll_wait). This
does not take CPU usage into consideration. If the event loop has not yet
started (e.g., in the first tick of the main script), the property has the
value of 0.
The high resolution millisecond timestamp at which the Node.js event loop
exited. If the event loop has not yet exited, the property has the value of -1.
It can only have a value of not -1 in a handler of the 'exit' event.
The high resolution millisecond timestamp at which the Node.js event loop started. If the event loop has not yet started (e.g., in the first tick of the main script), the property has the value of -1.
The high resolution millisecond timestamp at which the Node.js process was initialized.
#uvMetricsInfo: UVMetrics This is a wrapper to the uv_metrics_info function.
It returns the current set of event loop metrics.
It is recommended to use this property inside a function whose execution was
scheduled using setImmediate to avoid collecting metrics before finishing all
operations scheduled during the current loop iteration.
class PerformanceObserver
Usage in Deno
import { PerformanceObserver } from "node:perf_hooks";
Constructors #
#PerformanceObserver(callback: PerformanceObserverCallback) Methods #
#disconnect(): void Disconnects the PerformanceObserver instance from all notifications.
#observe(options: { entryTypes: readonly EntryType[]; buffered?: boolean | undefined; } | { type: EntryType; buffered?: boolean | undefined; }): void Subscribes the PerformanceObserver instance to notifications of new PerformanceEntry instances identified either by options.entryTypes or options.type:
import {
performance,
PerformanceObserver,
} from 'node:perf_hooks';
const obs = new PerformanceObserver((list, observer) => {
// Called once asynchronously. `list` contains three items.
});
obs.observe({ type: 'mark' });
for (let n = 0; n < 3; n++)
performance.mark(`test${n}`);
variable PerformanceObserver
class PerformanceObserverEntryList
Usage in Deno
import { PerformanceObserverEntryList } from "node:perf_hooks";
Methods #
Returns a list of PerformanceEntry objects in chronological order
with respect to 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');
#getEntriesByName(name: string,type?: EntryType,): PerformanceEntry[] Returns a list of PerformanceEntry objects in chronological order
with respect to performanceEntry.startTime whose performanceEntry.name is
equal to name, and optionally, whose performanceEntry.entryType is equal totype.
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');
#getEntriesByType(type: EntryType): PerformanceEntry[] Returns a list of PerformanceEntry objects in chronological order
with respect to performanceEntry.startTime whose performanceEntry.entryType is equal to 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');
variable PerformanceObserverEntryList
class PerformanceResourceTiming
Usage in Deno
import { PerformanceResourceTiming } from "node:perf_hooks";
Provides detailed network timing data regarding the loading of an application's resources.
The constructor of this class is not exposed to users directly.
Constructors #
#PerformanceResourceTiming() Properties #
#connectEnd: number The high resolution millisecond timestamp representing the time immediately after Node.js finishes establishing the connection to the server to retrieve the resource.
#connectStart: number The high resolution millisecond timestamp representing the time immediately before Node.js starts to establish the connection to the server to retrieve the resource.
#decodedBodySize: number A number representing the size (in octets) received from the fetch (HTTP or cache), of the message body, after removing any applied content-codings.
#domainLookupEnd: number The high resolution millisecond timestamp representing the time immediately after the Node.js finished the domain name lookup for the resource.
#domainLookupStart: number The high resolution millisecond timestamp immediately before the Node.js starts the domain name lookup for the resource.
#encodedBodySize: number A number representing the size (in octets) received from the fetch (HTTP or cache), of the payload body, before removing any applied content-codings.
#fetchStart: number The high resolution millisecond timestamp immediately before the Node.js starts to fetch the resource.
#redirectEnd: number The high resolution millisecond timestamp that will be created immediately after receiving the last byte of the response of the last redirect.
#redirectStart: number The high resolution millisecond timestamp that represents the start time of the fetch which initiates the redirect.
#requestStart: number The high resolution millisecond timestamp representing the time immediately before Node.js receives the first byte of the response from the server.
#responseEnd: number The high resolution millisecond timestamp representing the time immediately after Node.js receives the last byte of the resource or immediately before the transport connection is closed, whichever comes first.
#secureConnectionStart: number The high resolution millisecond timestamp representing the time immediately before Node.js starts the handshake process to secure the current connection.
#transferSize: number A number representing the size (in octets) of the fetched resource. The size includes the response header fields plus the response payload body.
#workerStart: number The high resolution millisecond timestamp at immediately before dispatching the fetch
request. If the resource is not intercepted by a worker the property will always return 0.
Methods #
variable PerformanceResourceTiming
function createHistogram
Usage in Deno
import { createHistogram } from "node:perf_hooks";
#createHistogram(options?: CreateHistogramOptions): RecordableHistogramfunction monitorEventLoopDelay
Usage in Deno
import { monitorEventLoopDelay } from "node:perf_hooks";
#monitorEventLoopDelay(options?: EventLoopMonitorOptions): IntervalHistogram
This symbol is not implemented.
This property is an extension by Node.js. It is not available in Web browsers.
Creates an IntervalHistogram object that samples and reports the event loop
delay over time. The delays will be reported in nanoseconds.
Using a timer to detect approximate event loop delay works because the execution of timers is tied specifically to the lifecycle of the libuv event loop. That is, a delay in the loop will cause a delay in the execution of the timer, and those delays are specifically what this API is intended to detect.
import { monitorEventLoopDelay } from 'node:perf_hooks';
const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
// Do something.
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));
Parameters #
#options: EventLoopMonitorOptions Return Type #
interface CreateHistogramOptions
Usage in Deno
import { type CreateHistogramOptions } from "node:perf_hooks";
Properties #
The minimum recordable value. Must be an integer value greater than 0.
The maximum recordable value. Must be an integer value greater than min.
interface EventLoopMonitorOptions
Usage in Deno
import { type EventLoopMonitorOptions } from "node:perf_hooks";
Properties #
#resolution: number | undefined The sampling rate in milliseconds. Must be greater than zero.
interface EventLoopUtilization
Usage in Deno
import { type EventLoopUtilization } from "node:perf_hooks";
interface Histogram
Usage in Deno
import { type Histogram } from "node:perf_hooks";
Properties #
#countBigInt: bigint The number of samples recorded by the histogram. v17.4.0, v16.14.0
The number of times the event loop delay exceeded the maximum 1 hour event loop delay threshold.
#exceedsBigInt: bigint The number of times the event loop delay exceeded the maximum 1 hour event loop delay threshold.
#percentiles: Map<number, number> Returns a Map object detailing the accumulated percentile distribution.
#percentilesBigInt: Map<bigint, bigint> Returns a Map object detailing the accumulated percentile distribution.
Methods #
#percentile(percentile: number): number Returns the value at the given percentile.
#percentileBigInt(percentile: number): bigint Returns the value at the given percentile.
interface IntervalHistogram
Usage in Deno
import { type IntervalHistogram } from "node:perf_hooks";
interface MeasureOptions
Usage in Deno
import { type MeasureOptions } from "node:perf_hooks";
Properties #
Timestamp to be used as the end time, or a string identifying a previously recorded mark.
interface NodeGCPerformanceDetail
Usage in Deno
import { type NodeGCPerformanceDetail } from "node:perf_hooks";
Properties #
When performanceEntry.entryType is equal to 'gc', the performance.kind property identifies
the type of garbage collection operation that occurred.
See perf_hooks.constants for valid values.
interface Performance
Usage in Deno
import { type Performance } from "node:perf_hooks";
Properties #
eventLoopUtilization is similar to CPU utilization except that it is calculated using high precision wall-clock time. It represents the percentage of time the event loop has spent outside the event loop's event provider (e.g. epoll_wait). No other CPU idle time is taken into consideration.
#nodeTiming: PerformanceNodeTiming This property is an extension by Node.js. It is not available in Web browsers.
An instance of the PerformanceNodeTiming class that provides performance metrics for specific Node.js operational milestones.
#timeOrigin: number The timeOrigin specifies the high resolution millisecond timestamp
at which the current node process began, measured in Unix time.
Methods #
#clearMarks(name?: string): void If name is not provided, removes all PerformanceMark objects from the Performance Timeline.
If name is provided, removes only the named mark.
#clearMeasures(name?: string): void If name is not provided, removes all PerformanceMeasure objects from the Performance Timeline.
If name is provided, removes only the named measure.
#clearResourceTimings(name?: string): void If name is not provided, removes all PerformanceResourceTiming objects from the Resource Timeline.
If name is provided, removes only the named resource.
Returns a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime.
If you are only interested in performance entries of certain types or that have certain names, see
performance.getEntriesByType() and performance.getEntriesByName().
#getEntriesByName(name: string,type?: EntryType,): PerformanceEntry[] Returns a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime
whose performanceEntry.name is equal to name, and optionally, whose performanceEntry.entryType is equal to type.
#getEntriesByType(type: EntryType): PerformanceEntry[] Returns a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime
whose performanceEntry.entryType is equal to type.
#mark(name: string,options?: MarkOptions,): PerformanceMark Creates a new PerformanceMark entry in the Performance Timeline.
A PerformanceMark is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'mark',
and whose performanceEntry.duration is always 0.
Performance marks are used to mark specific significant moments in the Performance Timeline.
The created PerformanceMark entry is put in the global Performance Timeline and can be queried with
performance.getEntries, performance.getEntriesByName, and performance.getEntriesByType. When the observation is
performed, the entries should be cleared from the global Performance Timeline manually with performance.clearMarks.
#markResourceTiming(timingInfo: object,requestedUrl: string,initiatorType: string,global: object,cacheMode: "" | "local",bodyInfo: object,responseStatus: number,deliveryType?: string,): PerformanceResourceTiming Creates a new PerformanceResourceTiming entry in the Resource Timeline.
A PerformanceResourceTiming is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'resource'.
Performance resources are used to mark moments in the Resource Timeline.
#measure(name: string,startMark?: string,endMark?: string,): PerformanceMeasure Creates a new PerformanceMeasure entry in the Performance Timeline. A PerformanceMeasure is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'measure', and whose performanceEntry.duration measures the number of milliseconds elapsed since startMark and endMark.
The startMark argument may identify any existing PerformanceMark in the the Performance Timeline, or may identify any of the timestamp properties provided by the PerformanceNodeTiming class. If the named startMark does not exist, then startMark is set to timeOrigin by default.
The endMark argument must identify any existing PerformanceMark in the the Performance Timeline or any of the timestamp properties provided by the PerformanceNodeTiming class. If the named endMark does not exist, an error will be thrown.
#measure(name: string,options: MeasureOptions,): PerformanceMeasure Returns the current high resolution millisecond timestamp, where 0 represents the start of the current node process.
#setResourceTimingBufferSize(maxSize: number): void Sets the global performance resource timing buffer size to the specified number of "resource" type performance entry objects.
By default the max buffer size is set to 250.
#timerify<T extends (...params: any[]) => any>(fn: T,options?: TimerifyOptions,): T This property is an extension by Node.js. It is not available in Web browsers.
Wraps a function within a new function that measures the running time of the wrapped function.
A PerformanceObserver must be subscribed to the 'function' event type in order for the timing details to be accessed.
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'] });
// A performance timeline entry will be created
wrapped();
If the wrapped function returns a promise, a finally handler will be attached to the promise and the duration will be reported once the finally handler is invoked.
An object which is JSON representation of the performance object. It is similar to
window.performance.toJSON in browsers.
interface RecordableHistogram
Usage in Deno
import { type RecordableHistogram } from "node:perf_hooks";
Methods #
#recordDelta(): void Calculates the amount of time (in nanoseconds) that has passed since the
previous call to recordDelta() and records that amount in the histogram.
#add(other: RecordableHistogram): void Adds the values from other to this histogram.
interface TimerifyOptions
Usage in Deno
import { type TimerifyOptions } from "node:perf_hooks";
Properties #
#histogram: RecordableHistogram | undefined A histogram object created using perf_hooks.createHistogram() that will record runtime
durations in nanoseconds.
interface UVMetrics
Usage in Deno
import { type UVMetrics } from "node:perf_hooks";
type alias EventLoopUtilityFunction
Usage in Deno
import { type EventLoopUtilityFunction } from "node:perf_hooks";
Definition #
(utilization1?: EventLoopUtilization,utilization2?: EventLoopUtilization,) => EventLoopUtilization type alias PerformanceObserverCallback
Usage in Deno
import { type PerformanceObserverCallback } from "node:perf_hooks";
Definition #
(list: PerformanceObserverEntryList,observer: PerformanceObserver,) => void variable constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_FLAGS_FORCED
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_FLAGS_NO
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_INCREMENTAL
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_MAJOR
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_MINOR
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable constants.NODE_PERFORMANCE_GC_WEAKCB
Usage in Deno
import { constants } from "node:perf_hooks";
Type #
number variable performance
Usage in Deno
import { performance } from "node:perf_hooks";