Spec-Zone.ru › Node.js 22 LTS

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

Стабильность: 2 — Стабильный

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

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

Node.js поддерживает следующие API веб-производительности:

  • Время с высоким разрешением
  • Временная шкала производительности
  • Пользовательское время
  • Время загрузки ресурсов
Модули JavaScript
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');
});
CommonJS
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 <string>

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

performance.clearMeasures([name])

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, указав объект performance в качестве получателя.

v16.7.0

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

  • name <string>

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

performance.clearResourceTimings([name])

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, указав объект performance в качестве получателя.

v18.2.0, v16.17.0

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

  • name <string>

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

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

Добавлено в: v14.10.0, v12.19.0
  • utilization1 <Object> Результат предыдущего вызова eventLoopUtilization().
  • utilization2 <Object> Результат предыдущего вызова eventLoopUtilization() перед utilization1.
  • Возвращает: <Object>
    • idle <number>
    • active <number>
    • utilization <number>

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

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

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

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

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

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

Модули JavaScript
import { eventLoopUtilization } from 'node:perf_hooks';
import { spawnSync } from 'node:child_process';

setImmediate(() => {
  const elu = eventLoopUtilization();
  spawnSync('sleep', ['5']);
  console.log(eventLoopUtilization(elu).utilization);
});
CommonJS
'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 в хронологическом порядке относительно performanceEntry.startTime. Если нужны записи производительности только определённых типов или с определёнными именами, см. performance.getEntriesByType() и performance.getEntriesByName().

performance.getEntriesByName(name[, type])

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, указав объект performance в качестве получателя.

v16.7.0

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

  • name <string>
  • type <string>
  • Возвращает: <PerformanceEntry[]>

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

performance.getEntriesByType(type)

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, указав объект performance в качестве получателя.

v16.7.0

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

  • type <string>
  • Возвращает: <PerformanceEntry[]>

Возвращает список объектов 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 на временной шкале производительности. PerformanceMark — это подкласс PerformanceEntry, у которого performanceEntry.entryType всегда равен 'mark', а performanceEntry.duration всегда равен 0. Метки производительности используются для обозначения важных событий на временной шкале производительности.

Созданная запись PerformanceMark помещается в глобальную временную шкалу производительности и может быть получена с помощью performance.getEntries, performance.getEntriesByName и performance.getEntriesByType. После выполнения наблюдения записи следует вручную удалить из глобальной временной шкалы производительности с помощью 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

  • timingInfo <Object> Информация о времени Fetch
  • requestedUrl <string> URL ресурса
  • initiatorType <string> Имя инициатора, например: 'fetch'
  • global <Object>
  • cacheMode <string> Режим кэша должен быть пустой строкой ('') или 'local'
  • bodyInfo <Object> Информация о теле ответа Fetch
  • responseStatus <number> Код состояния ответа
  • deliveryType <string> Тип доставки. По умолчанию: ''.

Это свойство является расширением 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 на временной шкале производительности. PerformanceMeasure — это подкласс PerformanceEntry, у которого performanceEntry.entryType всегда равен 'measure', а performanceEntry.duration измеряет количество миллисекунд, прошедших между startMark и endMark.

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

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

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

performance.nodeTiming

Добавлено в: v8.5.0
  • Тип: <PerformanceNodeTiming>

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

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

performance.now()

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, указав объект performance в качестве получателя.

v8.5.0

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

  • Возвращает: <number>

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

performance.setResourceTimingBufferSize(maxSize)

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, указав объект performance в качестве получателя.

v18.8.0

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

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

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

performance.timeOrigin

Добавлено в: v8.5.0
  • Тип: <number>

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

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

Модули JavaScript
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();
CommonJS
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, и длительность выполнения будет сообщена после вызова этого обработчика.

performance.toJSON()

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, указав объект performance в качестве получателя.

v16.1.0

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

Объект, представляющий объект performance в формате JSON. Он аналогичен 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

  • Тип: <number>

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

performanceEntry.entryType

История
Версия Изменения
v19.0.0

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

v8.5.0

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

  • Тип: <string>

Тип записи производительности. Это может быть одно из следующих значений:

  • 'dns' (только в Node.js)
  • 'function' (только в Node.js)
  • 'gc' (только в Node.js)
  • 'http2' (только в Node.js)
  • 'http' (только в Node.js)
  • 'mark' (доступно в веб-браузерах)
  • 'measure' (доступно в веб-браузерах)
  • 'net' (только в Node.js)
  • 'node' (только в Node.js)
  • 'resource' (доступно в веб-браузерах)

performanceEntry.name

История
Версия Изменения
v19.0.0

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

v8.5.0

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

  • Тип: <string>

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

performanceEntry.startTime

История
Версия Изменения
v19.0.0

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

v8.5.0

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

  • Тип: <number>

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

Класс: PerformanceMark

Добавлено в: v18.2.0, v16.17.0
  • Наследует: <PerformanceEntry>

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

performanceMark.detail

История
Версия Изменения
v19.0.0

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

v16.0.0

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

  • Тип: <any>

Дополнительные сведения, заданные при создании методом Performance.mark().

Класс: PerformanceMeasure

Добавлено в: v18.2.0, v16.17.0
  • Наследует: <PerformanceEntry>

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

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

performanceMeasure.detail

История
Версия Изменения
v19.0.0

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

v16.0.0

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

  • Тип: <any>

Дополнительные сведения, заданные при создании методом Performance.measure().

Класс: PerformanceNodeEntry

Добавлено в: v19.0.0
  • Наследует: <PerformanceEntry>

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

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

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

performanceNodeEntry.detail

История
Версия Изменения
v19.0.0

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

v16.0.0

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

  • Тип: <any>

Дополнительные сведения, относящиеся к entryType.

performanceNodeEntry.flags

История
Версия Изменения
v16.0.0

Устарело во время выполнения. Теперь перемещено в свойство detail, если entryType имеет значение 'gc'.

v13.9.0, v12.17.0

Добавлено в: v13.9.0, v12.17.0

Стабильность: 0 — Устарело: вместо этого используйте performanceNodeEntry.detail.
  • Тип: <number>

Если 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

Стабильность: 0 — Устарело: вместо этого используйте performanceNodeEntry.detail.
  • Тип: <number>

Если 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> Количество миллисекунд между PerformanceEntry startTime и получением первого фрейма DATA.
  • timeToFirstByteSent <number> Количество миллисекунд между PerformanceEntry startTime и отправкой первого фрейма DATA.
  • timeToFirstHeader <number> Количество миллисекунд между PerformanceEntry startTime и получением первого заголовка.

Если 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 и получением подтверждения. Присутствует только в том случае, если для Http2Session был отправлен фрейм PING.
  • streamAverageDuration <number> Средняя продолжительность (в миллисекундах) для всех экземпляров Http2Stream.
  • streamCount <number> Количество экземпляров Http2Stream, обработанных Http2Session.
  • type <string> Значение 'server' или 'client', определяющее тип Http2Session.

Подробные сведения о Timerify ('function')

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

Подробные сведения о Net ('net')

Если performanceEntry.type равно 'net', свойство performanceNodeEntry.detail будет объектом <Object>, содержащим дополнительные сведения.

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

Подробные сведения о DNS ('dns')

Если 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.

Класс: PerformanceNodeTiming

Добавлено в: v8.5.0
  • Наследует: <PerformanceEntry>

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

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

performanceNodeTiming.bootstrapComplete

Добавлено в: v8.5.0
  • Тип: <number>

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

performanceNodeTiming.environment

Добавлено в: v8.5.0
  • Тип: <number>

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

performanceNodeTiming.idleTime

Добавлено в: v14.10.0, v12.19.0
  • Тип: <number>

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

performanceNodeTiming.loopExit

Добавлено в: v8.5.0
  • Тип: <number>

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

performanceNodeTiming.loopStart

Добавлено в: v8.5.0
  • Тип: <number>

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

performanceNodeTiming.nodeStart

Добавлено в: v8.5.0
  • Тип: <number>

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

performanceNodeTiming.uvMetricsInfo

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

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

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

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

setImmediate(() => {
  console.log(performance.nodeTiming.uvMetricsInfo);
});
Модули JavaScript
import { performance } from 'node:perf_hooks';

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

performanceNodeTiming.v8Start

Добавлено в: v8.5.0
  • Тип: <number>

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

Класс: PerformanceResourceTiming

Добавлено в: v18.2.0, v16.17.0
  • Наследует: <PerformanceEntry>

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

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

performanceResourceTiming.workerStart

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.redirectStart

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.redirectEnd

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.fetchStart

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.domainLookupStart

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.domainLookupEnd

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.connectStart

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.connectEnd

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.secureConnectionStart

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.requestStart

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.responseEnd

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.transferSize

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.encodedBodySize

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

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

performanceResourceTiming.decodedBodySize

История
Версия Изменения
v19.0.0

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

v18.2.0, v16.17.0

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

  • Тип: <number>

Число, обозначающее размер тела сообщения (в октетах), полученного в результате fetch (по 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
  • Тип: <string[]>

Возвращает поддерживаемые типы.

new PerformanceObserver(callback)

История
Версия Изменения
v18.0.0

Передача недопустимого обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK.

v8.5.0

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

  • callback <Function>
    • list <PerformanceObserverEntryList>
    • observer <PerformanceObserver>

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

Модули JavaScript
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');
CommonJS
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, в обратный вызов наблюдателя передаются только PerformanceEntrys, созданные после указанного момента времени. По умолчанию: false.

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

Модули JavaScript
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}`);
CommonJS
const {
  performance,
  PerformanceObserver,
} = require('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}`);

performanceObserver.takeRecords()

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

Класс: PerformanceObserverEntryList

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

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

performanceObserverEntryList.getEntries()

Добавлено в: v8.5.0
  • Возвращает: <PerformanceEntry[]>

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

Модули JavaScript
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');
CommonJS
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
  • name <string>
  • type <string>
  • Возвращает: <PerformanceEntry[]>

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

Модули JavaScript
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');
CommonJS
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
  • type <string>
  • Возвращает: <PerformanceEntry[]>

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

Модули JavaScript
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');
CommonJS
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.

Модули JavaScript
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));
CommonJS
const { monitorEventLoopDelay } = require('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));

Класс: Histogram

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

histogram.count

Добавлено в: v17.4.0, v16.14.0
  • Тип: <number>

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

histogram.countBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <bigint>

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

histogram.exceeds

Добавлено в: v11.10.0
  • Тип: <number>

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

histogram.exceedsBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <bigint>

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

histogram.max

Добавлено в: v11.10.0
  • Тип: <number>

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

histogram.maxBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <bigint>

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

histogram.mean

Добавлено в: v11.10.0
  • Тип: <number>

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

histogram.min

Добавлено в: v11.10.0
  • Тип: <number>

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

histogram.minBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <bigint>

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

histogram.percentile(percentile)

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

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

histogram.percentileBigInt(percentile)

Добавлено в: v17.4.0, v16.14.0
  • percentile <number> Значение процентиля в диапазоне (0, 100].
  • Возвращает: <bigint>

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

histogram.percentiles

Добавлено в: v11.10.0
  • Тип: <Map>

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

histogram.percentilesBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <Map>

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

histogram.reset()

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

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

histogram.stddev

Добавлено в: v11.10.0
  • Тип: <number>

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

Класс: IntervalHistogram extends Histogram

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

histogram.disable()

Добавлено в: v11.10.0
  • Возвращает: <boolean>

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

histogram.enable()

Добавлено в: v11.10.0
  • Возвращает: <boolean>

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

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

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

Класс: RecordableHistogram extends Histogram

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

histogram.add(other)

Добавлено в: v17.4.0, v16.14.0
  • other <RecordableHistogram>

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

histogram.record(val)

Добавлено в: v15.9.0, v14.18.0
  • val <number> | <bigint> Значение, записываемое в гистограмму.

histogram.recordDelta()

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

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

Примеры

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

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

Модули JavaScript
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);
CommonJS
'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'] });

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

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

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

Модули JavaScript
import { performance, PerformanceObserver } from 'node:perf_hooks';

// Activate the observer
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');
CommonJS
'use strict';
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');
const mod = require('node:module');

// Monkey patch the require function
mod.Module.prototype.require =
  performance.timerify(mod.Module.prototype.require);
require = performance.timerify(require);

// Activate the observer
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'] });

require('some-module');

Измерение времени одного обмена данными по HTTP

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

Модули JavaScript
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}`);
});
CommonJS
'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) при успешном подключении

Модули JavaScript
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);
});
CommonJS
'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 при успешном запросе

Модули JavaScript
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');
CommonJS
'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');

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v22.x/docs/api/perf_hooks.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API