Skip to content

API для измерения производительности

[Стабильно: 2 - Стабильно]

Стабильно: 2 Стабильность: 2 - Стабильно

Исходный код: lib/perf_hooks.js

Этот модуль предоставляет реализацию подмножества W3C Web Performance APIs, а также дополнительные API для измерений производительности, специфичных для Node.js.

Node.js поддерживает следующие Web Performance APIs:

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

const obs = new PerformanceObserver((items) => {
  console.log(items.getEntries()[0].duration);
  performance.clearMarks();
});
obs.observe({ type: 'measure' });
performance.measure('Start to Now');

performance.mark('A');
doSomeLongRunningProcess(() => {
  performance.measure('A to Now', 'A');

  performance.mark('B');
  performance.measure('A to B', 'A', 'B');
});
js
const { PerformanceObserver, performance } = require('node:perf_hooks');

const obs = new PerformanceObserver((items) => {
  console.log(items.getEntries()[0].duration);
});
obs.observe({ type: 'measure' });
performance.measure('Start to Now');

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

  performance.mark('B');
  performance.measure('A to B', 'A', 'B');
})();

perf_hooks.performance

Добавлено в: v8.5.0

Объект, который может быть использован для сбора метрик производительности из текущего экземпляра Node.js. Он похож на window.performance в браузерах.

performance.clearMarks([name])

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v8.5.0Добавлено в: v8.5.0

Если name не указано, удаляет все объекты PerformanceMark из Timeline производительности. Если name указано, удаляет только указанную метку.

performance.clearMeasures([name])

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v16.7.0Добавлено в: v16.7.0

Если name не указано, удаляет все объекты PerformanceMeasure из Timeline производительности. Если name указано, удаляет только указанное измерение.

performance.clearResourceTimings([name])

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Если name не указано, удаляет все объекты PerformanceResourceTiming из Timeline ресурсов. Если name указано, удаляет только указанный ресурс.

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

Добавлено в: v14.10.0, v12.19.0

  • utilization1 <Object> Результат предыдущего вызова eventLoopUtilization().
  • utilization2 <Object> Результат предыдущего вызова eventLoopUtilization() до utilization1.
  • Возвращает: <Object>

Метод eventLoopUtilization() возвращает объект, содержащий совокупную продолжительность времени, в течение которого цикл событий был как в состоянии простоя, так и активным, в виде таймера высокого разрешения в миллисекундах. Значение utilization является вычисленным использованием цикла событий (ELU).

Если начальная загрузка еще не завершена в основном потоке, свойства имеют значение 0. ELU немедленно доступен в Worker threads, поскольку начальная загрузка происходит внутри цикла событий.

Оба параметра utilization1 и utilization2 являются необязательными.

Если передан параметр utilization1, то вычисляется и возвращается дельта между active и idle временами текущего вызова, а также соответствующее значение utilization (аналогично process.hrtime()).

Если переданы оба параметра utilization1 и utilization2, то дельта вычисляется между двумя аргументами. Это удобная опция, поскольку, в отличие от process.hrtime(), вычисление ELU более сложное, чем простое вычитание.

ELU аналогичен использованию ЦП, за исключением того, что он измеряет только статистику цикла событий, а не использование ЦП. Он представляет собой процент времени, в течение которого цикл событий провел вне провайдера событий цикла событий (например, epoll_wait). Никакое другое время простоя ЦП не принимается во внимание. Ниже приведен пример того, как в основном простаивающий процесс будет иметь высокий ELU.

js
import { eventLoopUtilization } from 'node:perf_hooks';
import { spawnSync } from 'node:child_process';

setImmediate(() => {
  const elu = eventLoopUtilization();
  spawnSync('sleep', ['5']);
  console.log(eventLoopUtilization(elu).utilization);
});
js
'use strict';
const { eventLoopUtilization } = require('node:perf_hooks').performance;
const { spawnSync } = require('node:child_process');

setImmediate(() => {
  const elu = eventLoopUtilization();
  spawnSync('sleep', ['5']);
  console.log(eventLoopUtilization(elu).utilization);
});

Хотя ЦП в основном простаивает во время выполнения этого скрипта, значение utilization равно 1. Это связано с тем, что вызов child_process.spawnSync() блокирует цикл событий от продолжения.

Передача пользовательского объекта вместо результата предыдущего вызова eventLoopUtilization() приведет к неопределенному поведению. Не гарантируется, что возвращаемые значения будут отражать какое-либо правильное состояние цикла событий.

performance.getEntries()

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v16.7.0Добавлено в версии: v16.7.0

Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime. Если вас интересуют только записи производительности определенных типов или с определенными именами, см. performance.getEntriesByType() и performance.getEntriesByName().

performance.getEntriesByName(name[, type])

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v16.7.0Добавлено в версии: v16.7.0

Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime, у которых performanceEntry.name равен name, и, при необходимости, у которых performanceEntry.entryType равен type.

performance.getEntriesByType(type)

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v16.7.0Добавлено в версии: v16.7.0

Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime, у которых performanceEntry.entryType равен type.

performance.mark(name[, options])

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя. Аргумент name больше не является необязательным.
v16.0.0Обновлено в соответствии со спецификацией User Timing Level 3.
v8.5.0Добавлено в версии: v8.5.0
  • name <string>
  • options <Object>
    • detail <any> Дополнительная необязательная информация, включаемая в отметку.
    • startTime <number> Необязательная временная метка, используемая в качестве времени отметки. По умолчанию: performance.now().

Создает новую запись PerformanceMark в Performance Timeline. PerformanceMark является подклассом PerformanceEntry, у которого performanceEntry.entryType всегда равно 'mark', а performanceEntry.duration всегда равно 0. Отметки производительности используются для обозначения определенных важных моментов в Performance Timeline.

Созданная запись PerformanceMark помещается в глобальную Performance Timeline и может быть запрошена с помощью performance.getEntries, performance.getEntriesByName и performance.getEntriesByType. При выполнении наблюдения записи должны быть удалены из глобальной Performance Timeline вручную с помощью performance.clearMarks.

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

[История]

ВерсияИзменения
v22.2.0Добавлены аргументы bodyInfo, responseStatus и deliveryType.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

Создает новую запись PerformanceResourceTiming в временной шкале ресурсов. PerformanceResourceTiming является подклассом PerformanceEntry, у которого performanceEntry.entryType всегда 'resource'. Ресурсы производительности используются для отметки моментов во временной шкале ресурсов.

Созданная запись PerformanceMark помещается в глобальную временную шкалу ресурсов и может быть запрошена с помощью performance.getEntries, performance.getEntriesByName и performance.getEntriesByType. Когда наблюдение выполнено, записи должны быть очищены из глобальной временной шкалы производительности вручную с помощью performance.clearResourceTimings.

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

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v16.0.0Обновлено в соответствии со спецификацией User Timing Level 3.
v13.13.0, v12.16.3Сделать параметры startMark и endMark необязательными.
v8.5.0Добавлено в: v8.5.0
  • name <string>

  • startMarkOrOptions <string> | <Object> Необязательный.

    • detail <any> Дополнительная необязательная информация, включаемая в измерение.
    • duration <number> Продолжительность между временем начала и окончания.
    • end <number> | <string> Временная метка, используемая в качестве времени окончания, или строка, идентифицирующая ранее записанную метку.
    • start <number> | <string> Временная метка, используемая в качестве времени начала, или строка, идентифицирующая ранее записанную метку.
  • endMark <string> Необязательный. Должен быть опущен, если startMarkOrOptions является <Object>.

Создает новую запись PerformanceMeasure в Performance Timeline. PerformanceMeasure является подклассом PerformanceEntry, у которого performanceEntry.entryType всегда 'measure', а performanceEntry.duration измеряет количество миллисекунд, прошедших между startMark и endMark.

Аргумент startMark может идентифицировать любую существующую PerformanceMark в Performance Timeline, или может идентифицировать любое из свойств временной метки, предоставляемых классом PerformanceNodeTiming. Если именованная startMark не существует, возникает ошибка.

Необязательный аргумент endMark должен идентифицировать любую существующую PerformanceMark в Performance Timeline или любое из свойств временной метки, предоставляемых классом PerformanceNodeTiming. endMark будет performance.now(), если параметр не передан, в противном случае, если именованная endMark не существует, будет выдана ошибка.

Созданная запись PerformanceMeasure помещается в глобальную Performance Timeline и может быть запрошена с помощью performance.getEntries, performance.getEntriesByName и performance.getEntriesByType. Когда наблюдение выполнено, записи должны быть удалены из глобальной Performance Timeline вручную с помощью performance.clearMeasures.

performance.nodeTiming

Добавлено в: v8.5.0

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

Экземпляр класса PerformanceNodeTiming, который предоставляет метрики производительности для конкретных операционных этапов Node.js.

performance.now()

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v8.5.0Добавлено в: v8.5.0

Возвращает текущую метку времени в миллисекундах с высоким разрешением, где 0 представляет начало текущего процесса node.

performance.setResourceTimingBufferSize(maxSize)

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v18.8.0Добавлено в: v18.8.0

Устанавливает глобальный размер буфера времени ресурсов производительности на указанное количество объектов записи производительности типа "ресурс".

По умолчанию максимальный размер буфера установлен на 250.

performance.timeOrigin

Добавлено в: v8.5.0

timeOrigin указывает метку времени в миллисекундах с высоким разрешением, когда начался текущий процесс node, измеренную в Unix time.

performance.timerify(fn[, options])

[История]

ВерсияИзменения
v16.0.0Добавлена опция histogram.
v16.0.0Перереализовано с использованием чистого JavaScript и возможностью отслеживать время асинхронных функций.
v8.5.0Добавлено в: v8.5.0
  • fn <Function>
  • options <Object>
    • histogram <RecordableHistogram> Объект гистограммы, созданный с помощью perf_hooks.createHistogram(), который будет записывать продолжительность выполнения в наносекундах.

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

Оборачивает функцию в новую функцию, которая измеряет время выполнения обернутой функции. PerformanceObserver должен быть подписан на тип события 'function', чтобы можно было получить доступ к деталям времени.

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

function someFunction() {
  console.log('hello world');
}

const wrapped = performance.timerify(someFunction);

const obs = new PerformanceObserver((list) => {
  console.log(list.getEntries()[0].duration);

  performance.clearMarks();
  performance.clearMeasures();
  obs.disconnect();
});
obs.observe({ entryTypes: ['function'] });

// A performance timeline entry will be created
wrapped();
js
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

function someFunction() {
  console.log('hello world');
}

const wrapped = performance.timerify(someFunction);

const obs = new PerformanceObserver((list) => {
  console.log(list.getEntries()[0].duration);

  performance.clearMarks();
  performance.clearMeasures();
  obs.disconnect();
});
obs.observe({ entryTypes: ['function'] });

// A performance timeline entry will be created
wrapped();

Если обернутая функция возвращает промис, к промису будет прикреплен обработчик finally, и продолжительность будет сообщена после вызова обработчика finally.

performance.toJSON()

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом performance в качестве получателя.
v16.1.0Добавлено в: v16.1.0

Объект, являющийся JSON-представлением объекта performance. Он похож на window.performance.toJSON в браузерах.

Событие: 'resourcetimingbufferfull'

Добавлено в: v18.8.0

Событие 'resourcetimingbufferfull' возникает, когда глобальный буфер времени ресурсов производительности заполнен. Отрегулируйте размер буфера времени ресурсов с помощью performance.setResourceTimingBufferSize() или очистите буфер с помощью performance.clearResourceTimings() в обработчике событий, чтобы разрешить добавление дополнительных записей в буфер временной шкалы производительности.

Класс: PerformanceEntry

Добавлено в: v8.5.0

Конструктор этого класса напрямую недоступен пользователям.

performanceEntry.duration

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceEntry в качестве получателя.
v8.5.0Добавлено в: v8.5.0

Общее количество миллисекунд, прошедших для этой записи. Это значение не будет значимым для всех типов записей производительности.

performanceEntry.entryType

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceEntry в качестве получателя.
v8.5.0Добавлено в: v8.5.0

Тип записи производительности. Он может быть одним из:

  • 'dns' (только Node.js)
  • 'function' (только Node.js)
  • 'gc' (только Node.js)
  • 'http2' (только Node.js)
  • 'http' (только Node.js)
  • 'mark' (доступно в Web)
  • 'measure' (доступно в Web)
  • 'net' (только Node.js)
  • 'node' (только Node.js)
  • 'resource' (доступно в Web)

performanceEntry.name

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceEntry в качестве получателя.
v8.5.0Добавлено в: v8.5.0

Имя записи производительности.

performanceEntry.startTime

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceEntry в качестве получателя.
v8.5.0Добавлено в: v8.5.0

Метка времени в миллисекундах высокого разрешения, отмечающая время начала записи производительности.

Класс: PerformanceMark

Добавлено в: v18.2.0, v16.17.0

Предоставляет доступ к меткам, созданным с помощью метода Performance.mark().

performanceMark.detail

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceMark в качестве получателя.
v16.0.0Добавлено в: v16.0.0

Дополнительные детали, указанные при создании с помощью метода Performance.mark().

Класс: PerformanceMeasure

Добавлено в: v18.2.0, v16.17.0

Предоставляет доступ к измерениям, созданным с помощью метода Performance.measure().

Конструктор этого класса напрямую не предоставляется пользователям.

performanceMeasure.detail

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceMeasure в качестве получателя.
v16.0.0Добавлено в: v16.0.0

Дополнительные детали, указанные при создании с помощью метода Performance.measure().

Класс: PerformanceNodeEntry

Добавлено в: v19.0.0

Этот класс является расширением Node.js. Он недоступен в веб-браузерах.

Предоставляет подробные данные о времени выполнения Node.js.

Конструктор этого класса не предоставляется пользователям напрямую.

performanceNodeEntry.detail

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceNodeEntry в качестве получателя.
v16.0.0Добавлено в: v16.0.0

Дополнительные детали, специфичные для entryType.

performanceNodeEntry.flags

[История]

ВерсияИзменения
v16.0.0Устарело во время выполнения. Теперь перемещено в свойство detail, когда entryType имеет значение 'gc'.
v13.9.0, v12.17.0Добавлено в: v13.9.0, v12.17.0

[Stable: 0 - Deprecated]

Stable: 0 Стабильность: 0 - Устарело: используйте performanceNodeEntry.detail вместо этого.

Когда performanceEntry.entryType равно 'gc', свойство performance.flags содержит дополнительную информацию об операции сборки мусора. Значение может быть одним из:

  • 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

[История]

ВерсияИзменения
v16.0.0Устарело во время выполнения. Теперь перемещено в свойство detail, когда entryType имеет значение 'gc'.
v8.5.0Добавлено в: v8.5.0

[Stable: 0 - Deprecated]

Stable: 0 Стабильность: 0 - Устарело: используйте performanceNodeEntry.detail вместо этого.

Когда performanceEntry.entryType равно 'gc', свойство performance.kind идентифицирует тип операции сборки мусора, которая произошла. Значение может быть одним из:

  • 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

Детали сборки мусора ('gc')

Когда performanceEntry.type равно 'gc', свойство performanceNodeEntry.detail будет <Object> с двумя свойствами:

  • kind <number> Одно из:

    • 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> Одно из:

    • 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

Детали HTTP ('http')

Когда performanceEntry.type равно 'http', свойство performanceNodeEntry.detail будет <Object>, содержащим дополнительную информацию.

Если performanceEntry.name равно HttpClient, detail будет содержать следующие свойства: req, res. А свойство req будет <Object>, содержащим method, url, headers, а свойство res будет <Object>, содержащим statusCode, statusMessage, headers.

Если performanceEntry.name равно HttpRequest, detail будет содержать следующие свойства: req, res. А свойство req будет <Object>, содержащим method, url, headers, а свойство res будет <Object>, содержащим statusCode, statusMessage, headers.

Это может добавить дополнительные накладные расходы на память и должно использоваться только в диагностических целях, а не оставаться включенным в рабочей среде по умолчанию.

Подробности HTTP/2 ('http2')

Когда performanceEntry.type равен 'http2', свойство performanceNodeEntry.detail будет <Object>, содержащим дополнительную информацию о производительности.

Если performanceEntry.name равен Http2Stream, detail будет содержать следующие свойства:

  • bytesRead <number> Количество байтов фрейма DATA, полученных для этого Http2Stream.
  • bytesWritten <number> Количество байтов фрейма DATA, отправленных для этого Http2Stream.
  • id <number> Идентификатор связанного Http2Stream.
  • timeToFirstByte <number> Количество миллисекунд, прошедшее между startTime PerformanceEntry и получением первого фрейма DATA.
  • timeToFirstByteSent <number> Количество миллисекунд, прошедшее между startTime PerformanceEntry и отправкой первого фрейма DATA.
  • timeToFirstHeader <number> Количество миллисекунд, прошедшее между startTime PerformanceEntry и получением первого заголовка.

Если performanceEntry.name равен Http2Session, detail будет содержать следующие свойства:

  • bytesRead <number> Количество байтов, полученных для этого Http2Session.
  • bytesWritten <number> Количество байтов, отправленных для этого Http2Session.
  • framesReceived <number> Количество фреймов HTTP/2, полученных Http2Session.
  • framesSent <number> Количество фреймов HTTP/2, отправленных Http2Session.
  • maxConcurrentStreams <number> Максимальное количество одновременно открытых потоков в течение времени существования Http2Session.
  • pingRTT <number> Количество миллисекунд, прошедшее с момента отправки фрейма PING и получения подтверждения. Присутствует только в том случае, если фрейм PING был отправлен в Http2Session.
  • streamAverageDuration <number> Средняя продолжительность (в миллисекундах) для всех экземпляров Http2Stream.
  • streamCount <number> Количество экземпляров Http2Stream, обработанных Http2Session.
  • type <string> Либо 'server', либо 'client' для идентификации типа Http2Session.

Timerify ('function') Details

Когда performanceEntry.type равен 'function', свойство performanceNodeEntry.detail будет <Array>, содержащим список входных аргументов синхронизируемой функции.

Net ('net') Details

Когда performanceEntry.type равен 'net', свойство performanceNodeEntry.detail будет <Object>, содержащим дополнительную информацию.

Если performanceEntry.name равен connect, свойство detail будет содержать следующие свойства: host, port.

DNS ('dns') Details

Когда performanceEntry.type равен 'dns', свойство performanceNodeEntry.detail будет <Object>, содержащим дополнительную информацию.

Если performanceEntry.name равен lookup, свойство detail будет содержать следующие свойства: hostname, family, hints, verbatim, addresses.

Если performanceEntry.name равен lookupService, свойство detail будет содержать следующие свойства: host, port, hostname, service.

Если performanceEntry.name равен queryxxx или getHostByAddr, свойство detail будет содержать следующие свойства: host, ttl, result. Значение result совпадает с результатом queryxxx или getHostByAddr.

Class: PerformanceNodeTiming

Added in: v8.5.0

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

Предоставляет детали синхронизации для самого Node.js. Конструктор этого класса недоступен для пользователей.

performanceNodeTiming.bootstrapComplete

Added in: v8.5.0

Метка времени в миллисекундах с высоким разрешением, в момент завершения процесса начальной загрузки Node.js. Если начальная загрузка еще не завершена, свойство имеет значение -1.

performanceNodeTiming.environment

Добавлено в версии: v8.5.0

Высокоточное значение времени в миллисекундах, когда была инициализирована среда Node.js.

performanceNodeTiming.idleTime

Добавлено в версии: v14.10.0, v12.19.0

Высокоточное значение времени в миллисекундах, показывающее, сколько времени цикл событий простаивал в поставщике событий цикла событий (например, epoll_wait). Это не учитывает использование ЦП. Если цикл событий еще не начался (например, в первом тике основного скрипта), свойство имеет значение 0.

performanceNodeTiming.loopExit

Добавлено в версии: v8.5.0

Высокоточное значение времени в миллисекундах, когда цикл событий Node.js завершился. Если цикл событий еще не завершился, свойство имеет значение -1. Оно может иметь значение, отличное от -1, только в обработчике события 'exit'.

performanceNodeTiming.loopStart

Добавлено в версии: v8.5.0

Высокоточное значение времени в миллисекундах, когда цикл событий Node.js начался. Если цикл событий еще не начался (например, в первом тике основного скрипта), свойство имеет значение -1.

performanceNodeTiming.nodeStart

Добавлено в версии: v8.5.0

Высокоточное значение времени в миллисекундах, когда был инициализирован процесс Node.js.

performanceNodeTiming.uvMetricsInfo

Добавлено в версии: v22.8.0, v20.18.0

  • Возвращает: <Object>
    • loopCount <number> Количество итераций цикла событий.
    • events <number> Количество событий, обработанных обработчиком событий.
    • eventsWaiting <number> Количество событий, ожидающих обработки, когда был вызван поставщик событий.

Это обертка для функции uv_metrics_info. Она возвращает текущий набор метрик цикла событий.

Рекомендуется использовать это свойство внутри функции, выполнение которой было запланировано с помощью setImmediate, чтобы избежать сбора метрик до завершения всех операций, запланированных во время текущей итерации цикла.

js
const { performance } = require('node:perf_hooks');

setImmediate(() => {
  console.log(performance.nodeTiming.uvMetricsInfo);
});
js
import { performance } from 'node:perf_hooks';

setImmediate(() => {
  console.log(performance.nodeTiming.uvMetricsInfo);
});

performanceNodeTiming.v8Start

Добавлено в версии: v8.5.0

Высокоточное значение метки времени в миллисекундах, когда была инициализирована платформа V8.

Класс: PerformanceResourceTiming

Добавлено в версии: v18.2.0, v16.17.0

Предоставляет подробные данные о времени сетевых операций, касающихся загрузки ресурсов приложения.

Конструктор этого класса напрямую недоступен для пользователей.

performanceResourceTiming.workerStart

[История]

ВерсияИзменения
v19.0.0Этот метод получения свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в версии: v18.2.0, v16.17.0

Высокоточное значение метки времени в миллисекундах непосредственно перед отправкой запроса fetch. Если ресурс не перехватывается воркером, свойство всегда будет возвращать 0.

performanceResourceTiming.redirectStart

[История]

ВерсияИзменения
v19.0.0Этот метод получения свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в версии: v18.2.0, v16.17.0

Высокоточное значение метки времени в миллисекундах, представляющее время начала выборки (fetch), которая инициирует перенаправление.

performanceResourceTiming.redirectEnd

[История]

ВерсияИзменения
v19.0.0Этот метод получения свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в версии: v18.2.0, v16.17.0

Высокоточное значение метки времени в миллисекундах, которое будет создано сразу после получения последнего байта ответа последнего перенаправления.

performanceResourceTiming.fetchStart

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Высокоточное представление времени в миллисекундах непосредственно перед тем, как Node.js начинает выборку ресурса.

performanceResourceTiming.domainLookupStart

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Высокоточное представление времени в миллисекундах непосредственно перед тем, как Node.js начинает поиск доменного имени для ресурса.

performanceResourceTiming.domainLookupEnd

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Высокоточное представление времени в миллисекундах, представляющее время сразу после того, как Node.js завершил поиск доменного имени для ресурса.

performanceResourceTiming.connectStart

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Высокоточное представление времени в миллисекундах, представляющее время непосредственно перед тем, как Node.js начинает устанавливать соединение с сервером для получения ресурса.

performanceResourceTiming.connectEnd

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Высокоточное представление временной метки в миллисекундах, представляющее время сразу после того, как Node.js завершает установление соединения с сервером для получения ресурса.

performanceResourceTiming.secureConnectionStart

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Высокоточное представление временной метки в миллисекундах, представляющее время непосредственно перед тем, как Node.js начинает процесс подтверждения для защиты текущего соединения.

performanceResourceTiming.requestStart

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Высокоточное представление временной метки в миллисекундах, представляющее время непосредственно перед тем, как Node.js получает первый байт ответа от сервера.

performanceResourceTiming.responseEnd

[История]

ВерсияИзменения
v19.0.0Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Высокоточное представление временной метки в миллисекундах, представляющее время сразу после того, как Node.js получает последний байт ресурса или непосредственно перед закрытием транспортного соединения, в зависимости от того, что произойдет раньше.

performanceResourceTiming.transferSize

[История]

ВерсияИзменения
v19.0.0Геттер этого свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Число, представляющее размер (в октетах) полученного ресурса. Размер включает поля заголовка ответа плюс тело полезной нагрузки ответа.

performanceResourceTiming.encodedBodySize

[История]

ВерсияИзменения
v19.0.0Геттер этого свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Число, представляющее размер (в октетах), полученный при выборке (HTTP или кеш), тела полезной нагрузки, до удаления каких-либо примененных кодировок содержимого.

performanceResourceTiming.decodedBodySize

[История]

ВерсияИзменения
v19.0.0Геттер этого свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Число, представляющее размер (в октетах), полученный при выборке (HTTP или кеш), тела сообщения, после удаления каких-либо примененных кодировок содержимого.

performanceResourceTiming.toJSON()

[История]

ВерсияИзменения
v19.0.0Этот метод должен вызываться с объектом PerformanceResourceTiming в качестве получателя.
v18.2.0, v16.17.0Добавлено в: v18.2.0, v16.17.0

Возвращает object, который является JSON-представлением объекта PerformanceResourceTiming.

Класс: PerformanceObserver

Добавлено в: v8.5.0

PerformanceObserver.supportedEntryTypes

Добавлено в: v16.0.0

Получить поддерживаемые типы.

new PerformanceObserver(callback)

[История]

ВерсияИзменения
v18.0.0Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.
v8.5.0Добавлено в: v8.5.0

Объекты PerformanceObserver предоставляют уведомления при добавлении новых экземпляров PerformanceEntry в Performance Timeline.

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

const obs = new PerformanceObserver((list, observer) => {
  console.log(list.getEntries());

  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ entryTypes: ['mark'], buffered: true });

performance.mark('test');
js
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

const obs = new PerformanceObserver((list, observer) => {
  console.log(list.getEntries());

  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ entryTypes: ['mark'], buffered: true });

performance.mark('test');

Поскольку экземпляры PerformanceObserver создают свои собственные дополнительные накладные расходы на производительность, экземпляры не следует оставлять подписанными на уведомления на неопределенный срок. Пользователи должны отключать наблюдатели, как только они больше не нужны.

callback вызывается, когда PerformanceObserver получает уведомление о новых экземплярах PerformanceEntry. Обратный вызов получает экземпляр PerformanceObserverEntryList и ссылку на PerformanceObserver.

performanceObserver.disconnect()

Добавлено в: v8.5.0

Отключает экземпляр PerformanceObserver от всех уведомлений.

performanceObserver.observe(options)

[История]

ВерсияИзменения
v16.7.0Обновлено в соответствии с Performance Timeline Level 2. Опция buffered была добавлена обратно.
v16.0.0Обновлено в соответствии с User Timing Level 3. Опция buffered была удалена.
v8.5.0Добавлено в: v8.5.0
  • options <Object>
    • type <string> Один тип <PerformanceEntry>. Не должен быть указан, если entryTypes уже задан.
    • entryTypes <string[]> Массив строк, определяющих типы экземпляров <PerformanceEntry>, которые интересуют наблюдателя. Если не указан, будет выдана ошибка.
    • buffered <boolean> Если true, обратный вызов наблюдателя вызывается со списком глобальных PerformanceEntry, буферизованных записей. Если false, только PerformanceEntry, созданные после указанного момента времени, отправляются в обратный вызов наблюдателя. По умолчанию: false.

Подписывает экземпляр <PerformanceObserver> на уведомления о новых экземплярах <PerformanceEntry>, идентифицируемых либо options.entryTypes, либо options.type:

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

const obs = new PerformanceObserver((list, observer) => {
  // Вызывается один раз асинхронно. `list` содержит три элемента.
});
obs.observe({ type: 'mark' });

for (let n = 0; n < 3; n++)
  performance.mark(`test${n}`);
js
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

const obs = new PerformanceObserver((list, observer) => {
  // Вызывается один раз асинхронно. `list` содержит три элемента.
});
obs.observe({ type: 'mark' });

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

performanceObserver.takeRecords()

Добавлено в версии: v16.0.0

  • Возвращает: <PerformanceEntry[]> Текущий список записей, хранящихся в наблюдателе производительности, очищая его.

Класс: PerformanceObserverEntryList

Добавлено в версии: v8.5.0

Класс PerformanceObserverEntryList используется для предоставления доступа к экземплярам PerformanceEntry, переданным в PerformanceObserver. Конструктор этого класса не предоставляется пользователям.

performanceObserverEntryList.getEntries()

Добавлено в версии: v8.5.0

Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime.

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

const obs = new PerformanceObserver((perfObserverList, observer) => {
  console.log(perfObserverList.getEntries());
  /**
   * [
   *   PerformanceEntry {
   *     name: 'test',
   *     entryType: 'mark',
   *     startTime: 81.465639,
   *     duration: 0,
   *     detail: null
   *   },
   *   PerformanceEntry {
   *     name: 'meow',
   *     entryType: 'mark',
   *     startTime: 81.860064,
   *     duration: 0,
   *     detail: null
   *   }
   * ]
   */

  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ type: 'mark' });

performance.mark('test');
performance.mark('meow');
js
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

const obs = new PerformanceObserver((perfObserverList, observer) => {
  console.log(perfObserverList.getEntries());
  /**
   * [
   *   PerformanceEntry {
   *     name: 'test',
   *     entryType: 'mark',
   *     startTime: 81.465639,
   *     duration: 0,
   *     detail: null
   *   },
   *   PerformanceEntry {
   *     name: 'meow',
   *     entryType: 'mark',
   *     startTime: 81.860064,
   *     duration: 0,
   *     detail: null
   *   }
   * ]
   */

  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ type: 'mark' });

performance.mark('test');
performance.mark('meow');

performanceObserverEntryList.getEntriesByName(name[, type])

Добавлено в: v8.5.0

Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime, чье свойство performanceEntry.name равно name, и, необязательно, чье свойство performanceEntry.entryType равно type.

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

const obs = new PerformanceObserver((perfObserverList, observer) => {
  console.log(perfObserverList.getEntriesByName('meow'));
  /**
   * [
   *   PerformanceEntry {
   *     name: 'meow',
   *     entryType: 'mark',
   *     startTime: 98.545991,
   *     duration: 0,
   *     detail: null
   *   }
   * ]
   */
  console.log(perfObserverList.getEntriesByName('nope')); // []

  console.log(perfObserverList.getEntriesByName('test', 'mark'));
  /**
   * [
   *   PerformanceEntry {
   *     name: 'test',
   *     entryType: 'mark',
   *     startTime: 63.518931,
   *     duration: 0,
   *     detail: null
   *   }
   * ]
   */
  console.log(perfObserverList.getEntriesByName('test', 'measure')); // []

  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ entryTypes: ['mark', 'measure'] });

performance.mark('test');
performance.mark('meow');
js
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

const obs = new PerformanceObserver((perfObserverList, observer) => {
  console.log(perfObserverList.getEntriesByName('meow'));
  /**
   * [
   *   PerformanceEntry {
   *     name: 'meow',
   *     entryType: 'mark',
   *     startTime: 98.545991,
   *     duration: 0,
   *     detail: null
   *   }
   * ]
   */
  console.log(perfObserverList.getEntriesByName('nope')); // []

  console.log(perfObserverList.getEntriesByName('test', 'mark'));
  /**
   * [
   *   PerformanceEntry {
   *     name: 'test',
   *     entryType: 'mark',
   *     startTime: 63.518931,
   *     duration: 0,
   *     detail: null
   *   }
   * ]
   */
  console.log(perfObserverList.getEntriesByName('test', 'measure')); // []

  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ entryTypes: ['mark', 'measure'] });

performance.mark('test');
performance.mark('meow');

performanceObserverEntryList.getEntriesByType(type)

Добавлено в версии: v8.5.0

Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime, у которых performanceEntry.entryType равен type.

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

const obs = new PerformanceObserver((perfObserverList, observer) => {
  console.log(perfObserverList.getEntriesByType('mark'));
  /**
   * [
   *   PerformanceEntry {
   *     name: 'test',
   *     entryType: 'mark',
   *     startTime: 55.897834,
   *     duration: 0,
   *     detail: null
   *   },
   *   PerformanceEntry {
   *     name: 'meow',
   *     entryType: 'mark',
   *     startTime: 56.350146,
   *     duration: 0,
   *     detail: null
   *   }
   * ]
   */
  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ type: 'mark' });

performance.mark('test');
performance.mark('meow');
js
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

const obs = new PerformanceObserver((perfObserverList, observer) => {
  console.log(perfObserverList.getEntriesByType('mark'));
  /**
   * [
   *   PerformanceEntry {
   *     name: 'test',
   *     entryType: 'mark',
   *     startTime: 55.897834,
   *     duration: 0,
   *     detail: null
   *   },
   *   PerformanceEntry {
   *     name: 'meow',
   *     entryType: 'mark',
   *     startTime: 56.350146,
   *     duration: 0,
   *     detail: null
   *   }
   * ]
   */
  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ type: 'mark' });

performance.mark('test');
performance.mark('meow');

perf_hooks.createHistogram([options])

Добавлено в версии: v15.9.0, v14.18.0

  • options <Object>

    • lowest <number> | <bigint> Наименьшее различимое значение. Должно быть целым числом больше 0. По умолчанию: 1.
    • highest <number> | <bigint> Наибольшее записываемое значение. Должно быть целым числом, равным или превышающим двукратное значение lowest. По умолчанию: Number.MAX_SAFE_INTEGER.
    • figures <number> Количество значащих цифр. Должно быть числом от 1 до 5. По умолчанию: 3.
  • Возвращает: <RecordableHistogram>

Возвращает <RecordableHistogram>.

perf_hooks.monitorEventLoopDelay([options])

Добавлено в: v11.10.0

  • options <Object>

    • resolution <number> Частота выборки в миллисекундах. Должна быть больше нуля. По умолчанию: 10.
  • Возвращает: <IntervalHistogram>

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

Создает объект IntervalHistogram, который отбирает и сообщает задержку цикла событий с течением времени. Задержки будут сообщаться в наносекундах.

Использование таймера для обнаружения приблизительной задержки цикла событий работает, потому что выполнение таймеров связано конкретно с жизненным циклом цикла событий libuv. То есть задержка в цикле вызовет задержку в выполнении таймера, и именно эти задержки предназначены для обнаружения этим API.

js
import { monitorEventLoopDelay } from 'node:perf_hooks';

const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
// Что-то сделать.
h.disable();
console.log(h.min);
console.log(h.max);
console.log(h.mean);
console.log(h.stddev);
console.log(h.percentiles);
console.log(h.percentile(50));
console.log(h.percentile(99));
js
const { monitorEventLoopDelay } = require('node:perf_hooks');
const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
// Что-то сделать.
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));

Класс: Histogram

Добавлено в: v11.10.0

histogram.count

Добавлено в: v17.4.0, v16.14.0

Количество выборок, записанных гистограммой.

histogram.countBigInt

Добавлено в: v17.4.0, v16.14.0

Количество выборок, записанных гистограммой.

histogram.exceeds

Добавлено в: v11.10.0

Количество случаев, когда задержка цикла событий превысила максимальный порог задержки цикла событий в 1 час.

histogram.exceedsBigInt

Добавлено в: v17.4.0, v16.14.0

Количество случаев, когда задержка цикла событий превысила максимальный порог задержки цикла событий в 1 час.

histogram.max

Добавлено в: v11.10.0

Максимальная зарегистрированная задержка цикла событий.

histogram.maxBigInt

Добавлено в: v17.4.0, v16.14.0

Максимальная зарегистрированная задержка цикла событий.

histogram.mean

Добавлено в: v11.10.0

Среднее значение зарегистрированных задержек цикла событий.

histogram.min

Добавлено в: v11.10.0

Минимальная зарегистрированная задержка цикла событий.

histogram.minBigInt

Добавлено в: v17.4.0, v16.14.0

Минимальная зарегистрированная задержка цикла событий.

histogram.percentile(percentile)

Добавлено в: v11.10.0

  • percentile <number> Значение процентиля в диапазоне (0, 100].
  • Returns: <number>

Возвращает значение в данном процентиле.

histogram.percentileBigInt(percentile)

Добавлено в: v17.4.0, v16.14.0

  • percentile <number> Значение процентиля в диапазоне (0, 100].
  • Returns: <bigint>

Возвращает значение в данном процентиле.

histogram.percentiles

Добавлено в: v11.10.0

Возвращает объект Map, детализирующий накопленное распределение перцентилей.

histogram.percentilesBigInt

Добавлено в: v17.4.0, v16.14.0

Возвращает объект Map, детализирующий накопленное распределение перцентилей.

histogram.reset()

Добавлено в: v11.10.0

Сбрасывает собранные данные гистограммы.

histogram.stddev

Добавлено в: v11.10.0

Стандартное отклонение записанных задержек цикла событий.

Class: IntervalHistogram extends Histogram

Histogram, которая периодически обновляется через заданный интервал.

histogram.disable()

Добавлено в: v11.10.0

Отключает таймер интервала обновления. Возвращает true, если таймер был остановлен, false, если он уже был остановлен.

histogram.enable()

Добавлено в: v11.10.0

Включает таймер интервала обновления. Возвращает true, если таймер был запущен, false, если он уже был запущен.

Клонирование IntervalHistogram

Экземпляры <IntervalHistogram> могут быть клонированы через <MessagePort>. На принимающей стороне гистограмма клонируется как простой объект <Histogram>, который не реализует методы enable() и disable().

Class: RecordableHistogram extends Histogram

Добавлено в: v15.9.0, v14.18.0

histogram.add(other)

Добавлено в: v17.4.0, v16.14.0

Добавляет значения из other в эту гистограмму.

histogram.record(val)

Добавлено в версии: v15.9.0, v14.18.0

  • val <number> | <bigint> Значение для записи в гистограмму.

histogram.recordDelta()

Добавлено в версии: v15.9.0, v14.18.0

Вычисляет количество времени (в наносекундах), прошедшее с момента предыдущего вызова recordDelta(), и записывает это количество в гистограмму.

Примеры

Измерение длительности асинхронных операций

В следующем примере используются Async Hooks и Performance API для измерения фактической длительности операции Timeout (включая время, затраченное на выполнение обратного вызова).

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

const set = new Set();
const hook = createHook({
  init(id, type) {
    if (type === 'Timeout') {
      performance.mark(`Timeout-${id}-Init`);
      set.add(id);
    }
  },
  destroy(id) {
    if (set.has(id)) {
      set.delete(id);
      performance.mark(`Timeout-${id}-Destroy`);
      performance.measure(`Timeout-${id}`,
                          `Timeout-${id}-Init`,
                          `Timeout-${id}-Destroy`);
    }
  },
});
hook.enable();

const obs = new PerformanceObserver((list, observer) => {
  console.log(list.getEntries()[0]);
  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ entryTypes: ['measure'], buffered: true });

setTimeout(() => {}, 1000);
js
'use strict';
const async_hooks = require('node:async_hooks');
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

const set = new Set();
const hook = async_hooks.createHook({
  init(id, type) {
    if (type === 'Timeout') {
      performance.mark(`Timeout-${id}-Init`);
      set.add(id);
    }
  },
  destroy(id) {
    if (set.has(id)) {
      set.delete(id);
      performance.mark(`Timeout-${id}-Destroy`);
      performance.measure(`Timeout-${id}`,
                          `Timeout-${id}-Init`,
                          `Timeout-${id}-Destroy`);
    }
  },
});
hook.enable();

const obs = new PerformanceObserver((list, observer) => {
  console.log(list.getEntries()[0]);
  performance.clearMarks();
  performance.clearMeasures();
  observer.disconnect();
});
obs.observe({ entryTypes: ['measure'], buffered: true });

setTimeout(() => {}, 1000);

Измерение времени загрузки зависимостей

Следующий пример измеряет продолжительность операций require() для загрузки зависимостей:

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

// Активировать наблюдателя
const obs = new PerformanceObserver((list) => {
  const entries = list.getEntries();
  entries.forEach((entry) => {
    console.log(`import('${entry[0]}')`, entry.duration);
  });
  performance.clearMarks();
  performance.clearMeasures();
  obs.disconnect();
});
obs.observe({ entryTypes: ['function'], buffered: true });

const timedImport = performance.timerify(async (module) => {
  return await import(module);
});

await timedImport('some-module');
js
'use strict';
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');
const mod = require('node:module');

// Перехватываем функцию require
mod.Module.prototype.require =
  performance.timerify(mod.Module.prototype.require);
require = performance.timerify(require);

// Активировать наблюдателя
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');

Измерение времени одного HTTP-цикла

Следующий пример используется для отслеживания времени, затраченного HTTP-клиентом (OutgoingMessage) и HTTP-запросом (IncomingMessage). Для HTTP-клиента это означает интервал времени между началом запроса и получением ответа, а для HTTP-запроса это означает интервал времени между получением запроса и отправкой ответа:

js
import { PerformanceObserver } from 'node:perf_hooks';
import { createServer, get } from 'node:http';

const obs = new PerformanceObserver((items) => {
  items.getEntries().forEach((item) => {
    console.log(item);
  });
});

obs.observe({ entryTypes: ['http'] });

const PORT = 8080;

createServer((req, res) => {
  res.end('ok');
}).listen(PORT, () => {
  get(`http://127.0.0.1:${PORT}`);
});
js
'use strict';
const { PerformanceObserver } = require('node:perf_hooks');
const http = require('node:http');

const obs = new PerformanceObserver((items) => {
  items.getEntries().forEach((item) => {
    console.log(item);
  });
});

obs.observe({ entryTypes: ['http'] });

const PORT = 8080;

http.createServer((req, res) => {
  res.end('ok');
}).listen(PORT, () => {
  http.get(`http://127.0.0.1:${PORT}`);
});

Измерение времени, которое занимает net.connect (только для TCP) при успешном подключении

js
import { PerformanceObserver } from 'node:perf_hooks';
import { connect, createServer } from 'node:net';

const obs = new PerformanceObserver((items) => {
  items.getEntries().forEach((item) => {
    console.log(item);
  });
});
obs.observe({ entryTypes: ['net'] });
const PORT = 8080;
createServer((socket) => {
  socket.destroy();
}).listen(PORT, () => {
  connect(PORT);
});
js
'use strict';
const { PerformanceObserver } = require('node:perf_hooks');
const net = require('node:net');
const obs = new PerformanceObserver((items) => {
  items.getEntries().forEach((item) => {
    console.log(item);
  });
});
obs.observe({ entryTypes: ['net'] });
const PORT = 8080;
net.createServer((socket) => {
  socket.destroy();
}).listen(PORT, () => {
  net.connect(PORT);
});

Измерение времени, которое занимает DNS при успешном запросе

js
import { PerformanceObserver } from 'node:perf_hooks';
import { lookup, promises } from 'node:dns';

const obs = new PerformanceObserver((items) => {
  items.getEntries().forEach((item) => {
    console.log(item);
  });
});
obs.observe({ entryTypes: ['dns'] });
lookup('localhost', () => {});
promises.resolve('localhost');
js
'use strict';
const { PerformanceObserver } = require('node:perf_hooks');
const dns = require('node:dns');
const obs = new PerformanceObserver((items) => {
  items.getEntries().forEach((item) => {
    console.log(item);
  });
});
obs.observe({ entryTypes: ['dns'] });
dns.lookup('localhost', () => {});
dns.promises.resolve('localhost');