Spec-Zone.ru › Node.js 20 LTS

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

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

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

Этот модуль предоставляет реализацию подмножества W3C API производительности веб-страниц, а также дополнительные 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)

Добавлен в: v18.2.0, v16.17.0
  • timingInfo <Объект> Информация о тайминге запроса
  • requestedUrl <строка> URL ресурса
  • initiatorType <строка> Название инициатора, например: 'fetch'
  • global <Объект>
  • cacheMode <строка> Режим кэширования должен быть пустой строкой ('') или 'local'

Это свойство — расширение 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. Оно недоступно в браузерах.

Оборачивает функцию в новую функцию, измеряющую время выполнения обернутой функции. Для доступа к данным тайминга необходимо подписаться на тип события PerformanceObserver в '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 в браузерах.

Event: '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

  • <число>

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

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

  • <любой>

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

performanceNodeEntry.flags

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

Отклонено во время выполнения. Теперь переместилось в свойство detail, когда entryType равен 'gc'.

v13.9.0, v12.17.0

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

Устойчивость: 0 - Устарело: Используйте performanceNodeEntry.detail вместо этого.
  • <число>

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

  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NO
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCED
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE

performanceNodeEntry.kind

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

Отклонено во время выполнения. Теперь переместилось в свойство detail, когда entryType равен 'gc'.

v8.5.0

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

Устойчивость: 0 - Устарело: Используйте performanceNodeEntry.detail вместо этого.
  • <число>

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

  • perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR
  • perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR
  • perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL
  • perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB

Подробности сборки мусора ('gc')

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

  • 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
  • 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

Подробности HTTP ('http')

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

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

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

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

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

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

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

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

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

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

Подробности Timerify ('функция')

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

Подробности 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

  • <число>

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

performanceResourceTiming.transferSize

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

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

v18.2.0, v16.17.0

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

  • <число>

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

performanceResourceTiming.encodedBodySize

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

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

v18.2.0, v16.17.0

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

  • <число>

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

performanceResourceTiming.decodedBodySize

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

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

v18.2.0, v16.17.0

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

  • <число>

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

performanceResourceTiming.toJSON()

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

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

v18.2.0, v16.17.0

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

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

Класс: PerformanceObserver

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

PerformanceObserver.supportedEntryTypes

Добавлен в: v16.0.0
  • <массив строк>

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

new PerformanceObserver(callback)

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

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

v8.5.0

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

  • callback <Функция>
    • list <PerformanceObserverEntryList>
    • 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 отслеживания времени пользователя. Опция 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
  • Возвращает: <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 <число> | <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/dist/latest-v20.x/docs/api/perf_hooks.html

Spec-Zone.ru

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