Spec-Zone.ru › Node.js 18 LTS

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])

Добавлена в: v8.5.0
  • name <строка>

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

performance.clearMeasures([name])

Добавлена в: v16.7.0
  • name <строка>

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

performance.clearResourceTimings([name])

Добавлена в: v18.2.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()

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

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

performance.getEntriesByName(name[, type])

Добавлена в: v16.7.0
  • name <строка>
  • type <строка>
  • Возвращает: <PerformanceEntry[]>

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

performance.getEntriesByType(type)

Добавлена в: v16.7.0
  • type <строка>
  • Возвращает: <PerformanceEntry[]>

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

performance.mark([name[, options]])

История
Версия Изменения
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
  • timingInfo <Объект> Информация о времени выполнения Fetch
  • 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]])

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

Обновлено для соответствия спецификации User Timing Level 3.

v13.13.0, v12.16.3

Параметры startMark и endMark стали необязательными.

v8.5.0

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

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

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

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

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

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

performance.nodeTiming

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

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

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

performance.now()

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

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

performance.setResourceTimingBufferSize(maxSize)

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

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

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

performance.timeOrigin

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

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

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

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

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

Событие: 'resourcetimingbufferfull'
Добавлен в: v18.8.0

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

Класс: PerformanceEntry

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

performanceEntry.detail

Добавлен в: v16.0.0
  • <любой>

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

performanceEntry.duration

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

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

performanceEntry.entryType

Добавлен в: v8.5.0
  • <строка>

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

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

performanceEntry.flags

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

Временный метод устарел. Теперь он перемещён в свойство detail при entryType 'gc'.

v13.9.0, v12.17.0

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

  • <число>

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

Когда 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

performanceEntry.name

Добавлен в: v8.5.0
  • <строка>

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

performanceEntry.kind

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

Временный метод устарел. Теперь он перемещён в свойство detail при entryType 'gc'.

v8.5.0

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

  • <число>

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

Когда 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

performanceEntry.startTime

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

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

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

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

Подробности Net ('сетевой')

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

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

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

Когда performanceEntry.type равно 'dns', свойство performanceEntry.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.

END_OF_DOCUMENT_MARKER

Класс: PerformanceResourceTiming

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

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

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

performanceResourceTiming.workerStart

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

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

performanceResourceTiming.redirectStart

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

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

performanceResourceTiming.redirectEnd

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

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

performanceResourceTiming.fetchStart

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

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

performanceResourceTiming.domainLookupStart

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

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

performanceResourceTiming.domainLookupEnd

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

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

performanceResourceTiming.connectStart

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

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

performanceResourceTiming.connectEnd

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

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

performanceResourceTiming.secureConnectionStart

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

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

performanceResourceTiming.requestStart

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

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

performanceResourceTiming.responseEnd

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

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

performanceResourceTiming.transferSize

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

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

performanceResourceTiming.encodedBodySize

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

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

performanceResourceTiming.decodedBodySize

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

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

performanceResourceTiming.toJSON()

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

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

Класс: perf_hooks.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
   *   },
   *   PerformanceEntry {
   *     name: 'meow',
   *     entryType: 'mark',
   *     startTime: 81.860064,
   *     duration: 0
   *   }
   * ]
   */

  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
   *   }
   * ]
   */
  console.log(perfObserverList.getEntriesByName('nope')); // []

  console.log(perfObserverList.getEntriesByName('test', 'mark'));
  /**
   * [
   *   PerformanceEntry {
   *     name: 'test',
   *     entryType: 'mark',
   *     startTime: 63.518931,
   *     duration: 0
   *   }
   * ]
   */
  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
   *   },
   *   PerformanceEntry {
   *     name: 'meow',
   *     entryType: 'mark',
   *     startTime: 56.350146,
   *     duration: 0
   *   }
   * ]
   */
  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>

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

histogram.percentilesBigInt

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

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

histogram.reset()

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

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

Стандартное отклонение histogram.stddev

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

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

Класс: IntervalHistogram extends Histogram

Периодически обновляемая Histogram на заданном интервале.

histogram.disable()

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

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

histogram.enable()

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

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

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

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

Класс: RecordableHistogram extends Histogram

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

histogram.add(other)

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

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

histogram.record(val)

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

histogram.recordDelta()

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

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

Примеры

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

В следующем примере используются 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-v18.x/docs/api/perf_hooks.html

Spec-Zone.ru

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