Spec-Zone.ru › Node.js

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

Устойчивость: 2 - Стабильно

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

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

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

  • Высокоточная временная шкала
  • Временная шкала производительности
  • Измерение времени работы пользователя
  • Измерение времени ресурсов
const { PerformanceObserver, performance } = require('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');
}); copy

perf_hooks.performance

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

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

performance.clearMarks([name])

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

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

v8.5.0

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

  • name <строка>

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

performance.clearMeasures([name])

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

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

v16.7.0

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

  • name <строка>

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

performance.clearResourceTimings([name])

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

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

v18.2.0, v16.17.0

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

  • name <строка>

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

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

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

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

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

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

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

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

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

'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);
}); copy

Хотя процессор в основном простаивает во время выполнения этого скрипта, значение 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 <строка>
  • type <строка>
  • Возвращает: <PerformanceEntry[]>

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

performance.getEntriesByType(type)

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

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

v16.7.0

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

  • type <строка>
  • Возвращает: <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 <строка>
  • options <Объект>
    • detail <любой> Дополнительные необязательные детали для включения в метку.
    • startTime <число> Необязательный временной отметки, который будет использоваться в качестве времени метки. По умолчанию: 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])

END_OF_DOCUMENT_MARKER
История
Версия Изменения
v22.2.0

Добавлены аргументы bodyInfo, responseStatus и deliveryType.

v18.2.0, v16.17.0

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

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

Это свойство является расширением 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 <строка>
  • startMarkOrOptions <строка> | <Объект> Необязательно.
    • detail <любой тип> Дополнительные необязательные детали для включения в измерение.
    • duration <число> Длительность между начальным и конечным временем.
    • end <число> | <строка> Отметка времени, используемая в качестве конечного времени, или строка, идентифицирующая ранее записанную метку.
    • start <число> | <строка> Отметка времени, используемая в качестве начального времени, или строка, идентифицирующая ранее записанную метку.
  • endMark <строка> Необязательно. Должно быть опущено, если startMarkOrOptions является <объектом>.

Создаёт новую запись 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

  • Возвращает: <число>

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

performance.setResourceTimingBufferSize(maxSize)

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

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

v18.8.0

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

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

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

performance.timeOrigin

Добавлены в: v8.5.0
  • <число>

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

performance.timerify(fn[, options])

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

Добавлен параметр гистограммы.

v16.0.0

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

v8.5.0

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

  • fn <Функция>
  • options <Объект>
    • histogram <RecordableHistogram> Объект гистограммы, созданный с помощью perf_hooks.createHistogram(), который будет записывать длительность выполнения в наносекундах.

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

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

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(); copy

Если обернутая функция возвращает промис, к промису будет добавлен обработчик 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

  • <строка>

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

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

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
  • Расширяет: <PerformanceEntry>

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

performanceMark.detail

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

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

v16.0.0

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

  • <любое>

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

Класс: PerformanceMeasure

Добавлен в: v18.2.0, v16.17.0
  • Расширяет: <PerformanceEntry>

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

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

performanceMeasure.detail

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

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

v16.0.0

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

  • <любое>

Дополнительные детали, указанные при создании с помощью метода 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 и получения его подтверждения. Присутствует только в том случае, если фрейм PING был отправлен на Http2Session.
  • 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 будет <объектом>, содержащим дополнительную информацию.

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

Подробности DNS ('dns')

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

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

Отметка времени в миллисекундах с высокой точностью, когда процесс 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.v8Start

Добавлен в: v8.5.0
  • <число>

Отметка времени в миллисекундах с высокой точностью, когда платформа 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

  • <число>

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

performanceResourceTiming.redirectStart

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

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

v18.2.0, v16.17.0

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

  • <число>

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

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

  • <число>

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

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

  • callback <Функция>
    • list <Список записей PerformanceObserverEntry>
    • observer <PerformanceObserver>

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

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'); copy

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

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

performanceObserver.disconnect()

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

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

performanceObserver.observe(options)

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

Обновлено в соответствии с уровнем 2 хронологии производительности. Опция buffered была добавлена обратно.

v16.0.0

Обновлено в соответствии с уровнем 3 User Timing. Опция buffered была удалена.

v8.5.0

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

  • options <Объект>
    • type <строка> Один тип <PerformanceEntry>. Не должен быть указан, если entryTypes уже определён.
    • entryTypes <строковый массив> Массив строк, определяющих типы экземпляров <PerformanceEntry>, в которых заинтересован наблюдатель. Если не указан, будет выброшено исключение.
    • buffered <логическое значение> Если true, обратный вызов наблюдателя вызывается со списком глобальных буферизованных записей PerformanceEntry. Если false, только экземпляры PerformanceEntry, созданные после указанного момента времени, отправляются обратному вызову наблюдателя. По умолчанию: false.

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

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}`); copy

Класс: PerformanceObserverEntryList

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

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

performanceObserverEntryList.getEntries()

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

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

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'); copy

performanceObserverEntryList.getEntriesByName(name[, type])

Добавлен в: v8.5.0
  • name <строка>
  • type <строка>
  • Возвращает: <Массив PerformanceEntry>

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

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'); copy

performanceObserverEntryList.getEntriesByType(type)

Добавлен в: v8.5.0
  • type <строка>
  • Возвращает: <Массив PerformanceEntry>

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

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'); copy

perf_hooks.createHistogram([options])

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

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

perf_hooks.monitorEventLoopDelay([options])

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

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

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

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

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)); copy

Класс: Histogram

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

histogram.count

Добавлен в: v17.4.0, v16.14.0
  • <число>

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

histogram.countBigInt

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

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

histogram.exceeds

Добавлен в: v11.10.0
  • <число>

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

histogram.exceedsBigInt

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

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

histogram.max

Добавлен в: v11.10.0
  • <число>

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

histogram.maxBigInt

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

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

histogram.mean

Добавлен в: v11.10.0
  • <число>

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

histogram.min

Добавлен в: v11.10.0
  • <число>

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

histogram.minBigInt

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

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

histogram.percentile(percentile)

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

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

histogram.percentileBigInt(percentile)

Добавлен в: v17.4.0, v16.14.0
  • percentile <число> Значение процентиля в диапазоне (0, 100].
  • Возвращает: <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
  • <число>

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

Класс: IntervalHistogram extends Histogram

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

histogram.disable()

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

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

histogram.enable()

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

Включает таймер интервала обновления. Возвращает 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 <число> | <bigint> Значение для записи в гистограмму.

histogram.recordDelta()

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

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

Примеры

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

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

'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); copy

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

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

'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'], buffered: true });

require('some-module'); copy

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

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

'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}`);
}); copy

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

'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);
}); copy

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

'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'); copy

© 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/api/perf_hooks.html

Spec-Zone.ru

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