API измерения производительности
Исходный код: 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
Объект, который можно использовать для сбора показателей производительности текущего экземпляра Node.js. Он похож на window.performance в браузерах.
performance.clearMarks([name])
-
name<строка>
Если name не предоставлен, удаляет все объекты PerformanceMark из временной шкалы производительности. Если name предоставлен, удаляется только метка с указанным именем.
performance.clearMeasures([name])
-
name<строка>
Если name не предоставлен, удаляет все объекты PerformanceMeasure из временной шкалы производительности. Если name предоставлен, удаляется только измерение с указанным именем.
performance.clearResourceTimings([name])
-
name<строка>
Если name не предоставлен, удаляет все объекты PerformanceResourceTiming из временной шкалы ресурсов. Если name предоставлен, удаляется только указанный ресурс.
performance.eventLoopUtilization([utilization1[, utilization2]])
-
utilization1<Объект> Результат предыдущего вызоваeventLoopUtilization(). -
utilization2<Объект> Результат предыдущего вызоваeventLoopUtilization()доutilization1. - Возвращает: <Объект>
Метод 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()
- Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime. Если вас интересуют только записи производительности определённых типов или с определёнными именами, см. performance.getEntriesByType() и performance.getEntriesByName().
performance.getEntriesByName(name[, type])
-
name<строка> -
type<строка> - Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime, у которых performanceEntry.name равно name, и необязательно, у которых performanceEntry.entryType равно type.
performance.getEntriesByType(type)
-
type<строка> - Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime, у которых performanceEntry.entryType равно type.
performance.mark(name[, options])
Создаёт новую запись 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])
-
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]])
-
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
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Экземпляр класса PerformanceNodeTiming, который предоставляет метрики производительности для определённых операционных вех Node.js.
performance.now()
- Возвращает: <число>
Возвращает текущую высокоточную отметку времени в миллисекундах, где 0 соответствует началу текущего процесса node.
performance.setResourceTimingBufferSize(maxSize)
Устанавливает глобальный буфер размера временной шкалы ресурсов производительности на указанное количество объектов записи типа "ресурс".
По умолчанию максимальный размер буфера установлен в 250.
performance.timeOrigin
Значение timeOrigin указывает высокоточную отметку времени в миллисекундах, с которой начался текущий процесс node, измеренную в формате Unix.
performance.timerify(fn[, options])
-
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()
Объект, представляющий собой JSON-представление объекта performance. Аналогичен window.performance.toJSON в браузерах.
Событие: 'resourcetimingbufferfull'
Событие 'resourcetimingbufferfull' срабатывает при заполнении глобального буфера отслеживания ресурсов производительности. Измените размер буфера отслеживания ресурсов с помощью performance.setResourceTimingBufferSize() или очистите буфер с помощью performance.clearResourceTimings() в обработчике событий, чтобы добавить больше записей в буфер временной шкалы производительности.
Класс: PerformanceEntry
Конструктор этого класса не предоставляется пользователям напрямую.
performanceEntry.duration
Общее количество миллисекунд, затраченное на эту запись. Это значение не будет иметь смысла для всех типов записей производительности.
performanceEntry.entryType
Тип записи производительности. Он может быть одним из:
-
'node'(только Node.js) -
'mark'(доступно в браузере) -
'measure'(доступно в браузере) -
'gc'(только Node.js) -
'function'(только Node.js) -
'http2'(только Node.js) -
'http'(только Node.js)
performanceEntry.name
Имя записи производительности.
performanceEntry.startTime
Маркер временной метки с высокой точностью в миллисекундах, обозначающий начальное время записи производительности.
Класс: PerformanceMark
- Расширяет: <PerformanceEntry>
Предоставляет метки, созданные с помощью метода Performance.mark().
performanceMark.detail
Дополнительные детали, указанные при создании с помощью метода Performance.mark().
Класс: PerformanceMeasure
- Расширяет: <PerformanceEntry>
Предоставляет измерения, созданные с помощью метода Performance.measure().
Конструктор этого класса не предоставляется пользователям напрямую.
performanceMeasure.detail
Дополнительные детали, указанные при создании с помощью метода Performance.measure().
Класс: PerformanceNodeEntry
- Расширяет: <PerformanceEntry>
Этот класс является расширением Node.js. Он недоступен в веб-браузерах.
Предоставляет подробные данные о времени Node.js.
Конструктор этого класса не предоставляется пользователям напрямую.
performanceNodeEntry.detail
Дополнительные сведения, относящиеся к entryType.
performanceNodeEntry.flags
performanceNodeEntry.detail вместо этого.Когда performanceEntry.entryType равно 'gc', свойство performance.flags содержит дополнительную информацию об операции сборки мусора. Значение может быть одним из:
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NOperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINEDperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCEDperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSINGperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGEperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORYperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE
performanceNodeEntry.kind
performanceNodeEntry.detail вместо этого.Когда performanceEntry.entryType равно 'gc', свойство performance.kind определяет тип операции сборки мусора, которая произошла. Значение может быть одним из:
perf_hooks.constants.NODE_PERFORMANCE_GC_MAJORperf_hooks.constants.NODE_PERFORMANCE_GC_MINORperf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTALperf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
Подробности сборки мусора ('gc')
Когда performanceEntry.type равно 'gc', свойство performanceNodeEntry.detail будет объектом <Object> с двумя свойствами:
-
kind<number> Одно из:perf_hooks.constants.NODE_PERFORMANCE_GC_MAJORperf_hooks.constants.NODE_PERFORMANCE_GC_MINORperf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTALperf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
-
flags<number> Одно из:perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NOperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINEDperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCEDperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSINGperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGEperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORYperf_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> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи приёмом первого фреймаDATA. -
timeToFirstByteSent<number> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи отправкой первого фреймаDATA. -
timeToFirstHeader<number> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи приёмом первого заголовка.
Если 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
- Расширяет: <PerformanceEntry>
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Предоставляет детали времени выполнения самого Node.js. Конструктор этого класса не предоставляется пользователям.
performanceNodeTiming.bootstrapComplete
Отметка времени в миллисекундах с высокой точностью, когда процесс Node.js завершил загрузку. Если загрузка еще не завершена, свойство имеет значение -1.
performanceNodeTiming.environment
Отметка времени в миллисекундах с высокой точностью, когда среда Node.js была инициализирована.
performanceNodeTiming.idleTime
Отметка времени в миллисекундах с высокой точностью, сколько времени цикл событий был неактивным в поставщике событий цикла событий (например, epoll_wait). Это не учитывает использование ЦП. Если цикл событий еще не запущен (например, в первом цикле основного сценария), свойство имеет значение 0.
performanceNodeTiming.loopExit
Отметка времени в миллисекундах с высокой точностью, когда цикл событий Node.js завершился. Если цикл событий еще не завершен, свойство имеет значение -1. Оно может иметь значение, отличное от -1, только в обработчике события 'exit'.
performanceNodeTiming.loopStart
Отметка времени в миллисекундах с высокой точностью, когда цикл событий Node.js запустился. Если цикл событий еще не запущен (например, в первом цикле основного сценария), свойство имеет значение -1.
performanceNodeTiming.nodeStart
Отметка времени в миллисекундах с высокой точностью, когда процесс Node.js был инициализирован.
performanceNodeTiming.v8Start
Отметка времени в миллисекундах с высокой точностью, когда платформа V8 была инициализирована.
Класс: PerformanceResourceTiming
- Расширяет: <PerformanceEntry>
Предоставляет подробные данные о времени загрузки ресурсов приложения.
Конструктор этого класса не предоставляется пользователю напрямую.
performanceResourceTiming.workerStart
Отметка времени в миллисекундах с высокой точностью, непосредственно перед отправкой запроса fetch. Если ресурс не перехватывается рабочим процессом, свойство всегда возвращает 0.
performanceResourceTiming.redirectStart
Отметка времени в миллисекундах с высокой точностью, представляющая время начала запроса, инициирующего переадресацию.
performanceResourceTiming.redirectEnd
Отметка времени в миллисекундах с высокой точностью, создаваемая сразу после получения последнего байта ответа последней переадресации.
performanceResourceTiming.fetchStart
Отметка времени в миллисекундах с высокой точностью непосредственно перед тем, как Node.js начинает загрузку ресурса.
performanceResourceTiming.domainLookupStart
Отметка времени в миллисекундах с высокой точностью непосредственно перед началом поиска доменного имени ресурса в Node.js.
performanceResourceTiming.domainLookupEnd
Отметка времени в миллисекундах с высокой точностью, представляющая время сразу после завершения поиска доменного имени ресурса в Node.js.
performanceResourceTiming.connectStart
Отметка времени в миллисекундах с высокой точностью, представляющая время непосредственно перед началом установления соединения с сервером для получения ресурса в Node.js.
performanceResourceTiming.connectEnd
Отметка времени в миллисекундах с высокой точностью, представляющая время непосредственно после завершения установления соединения с сервером для получения ресурса в Node.js.
performanceResourceTiming.secureConnectionStart
Отметка времени в миллисекундах с высокой точностью, представляющая время непосредственно перед началом процесса установления защищённого соединения в Node.js.
performanceResourceTiming.requestStart
Отметка времени в миллисекундах с высокой точностью, представляющая время непосредственно перед получением первого байта ответа от сервера в Node.js.
performanceResourceTiming.responseEnd
Отметка времени в миллисекундах с высокой точностью, представляющая время сразу после получения последнего байта ресурса или непосредственно перед закрытием транспортного соединения, что произойдет первым.
performanceResourceTiming.transferSize
Число, представляющее размер (в байтах) загруженного ресурса. Размер включает поля заголовка ответа и тело полезной нагрузки ответа.
performanceResourceTiming.encodedBodySize
Число, представляющее размер (в байтах) полезной нагрузки, полученной при загрузке (HTTP или кеш), до удаления любых применённых кодировок содержимого.
performanceResourceTiming.decodedBodySize
Число, представляющее размер (в байтах) полезной нагрузки сообщения, полученной при загрузке (HTTP или кеш), после удаления любых применённых кодировок содержимого.
performanceResourceTiming.toJSON()
Возвращает object, представляющий собой JSON-представление объекта PerformanceResourceTiming
Класс: PerformanceObserver
PerformanceObserver.supportedEntryTypes
Получить поддерживаемые типы.
new PerformanceObserver(callback)
-
callback<Функция>
Объекты 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()
Отключает экземпляр PerformanceObserver от всех уведомлений.
performanceObserver.observe(options)
-
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
Класс PerformanceObserverEntryList используется для доступа к экземплярам PerformanceEntry , переданным в PerformanceObserver. Конструктор этого класса недоступен пользователям.
performanceObserverEntryList.getEntries()
- Возвращает: <Массив 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])
-
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)
-
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])
-
options<Объект>-
lowest<число> | <BigInt> Наименьшее различимое значение. Должно быть целым значением больше 0. По умолчанию:1. -
highest<число> | <BigInt> Наибольшее регистрируемое значение. Должно быть целым значением, равным или большим чем два разаlowest. По умолчанию:Number.MAX_SAFE_INTEGER. -
figures<число> Количество значащих цифр. Должно быть числом от1до5. По умолчанию:3.
-
- Возвращает: <RecordableHistogram>
Возвращает <RecordableHistogram>.
perf_hooks.monitorEventLoopDelay([options])
-
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
histogram.count
Количество записанных выборок в гистограмме.
histogram.countBigInt
Количество записанных выборок в гистограмме.
histogram.exceeds
Количество раз, когда задержка цикла событий превысила максимальное пороговое значение в 1 час.
histogram.exceedsBigInt
Количество раз, когда задержка цикла событий превысила максимальное пороговое значение в 1 час.
histogram.max
Максимальная зарегистрированная задержка цикла событий.
histogram.maxBigInt
Максимальная зарегистрированная задержка цикла событий.
histogram.mean
Среднее значение зарегистрированных задержек цикла событий.
histogram.min
Минимальная зарегистрированная задержка цикла событий.
histogram.minBigInt
Минимальная зарегистрированная задержка цикла событий.
histogram.percentile(percentile)
Возвращает значение по заданному процентилю.
histogram.percentileBigInt(percentile)
Возвращает значение по заданному процентилю.
histogram.percentiles
Возвращает объект, содержащий данные о накопленном распределении процентилей.
histogram.percentilesBigInt
Возвращает объект, содержащий данные о накопленном распределении процентилей.
histogram.reset()
Сбрасывает собранные данные гистограммы.
histogram.stddev
Стандартное отклонение зарегистрированных задержек цикла событий.
Класс: IntervalHistogram extends Histogram
Гистограмма, которая периодически обновляется в заданный интервал.
histogram.disable()
- Возвращает: <булево>
Отключает таймер интервала обновления. Возвращает true если таймер был остановлен, false если он уже был остановлен.
histogram.enable()
- Возвращает: <булево>
Включает таймер интервала обновления. Возвращает true если таймер был запущен, false если он уже был запущен.
Клонирование IntervalHistogram
<IntervalHistogram> можно клонировать с помощью <MessagePort>. На стороне получателя гистограмма клонируется как обычный объект <Histogram>, который не реализует методы enable() и disable().
Класс: RecordableHistogram extends Histogram
histogram.add(other)
-
other<RecordableHistogram>
Добавляет значения из other в эту гистограмму.
histogram.record(val)
histogram.recordDelta()
Вычисляет интервал времени (в наносекундах) с момента предыдущего вызова 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