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)
-
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]])
-
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
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Экземпляр класса PerformanceNodeTiming, который предоставляет метрики производительности для определённых этапов работы Node.js.
performance.now()
- Возвращает: <number>
Возвращает текущую отметку времени в миллисекундах с высокой точностью, где 0 соответствует началу текущего процесса node.
performance.setResourceTimingBufferSize(maxSize)
Устанавливает глобальный размер буфера временных данных ресурсов производительности на указанное количество объектов записей производительности типа "ресурс".
По умолчанию максимальный размер буфера составляет 250.
performance.timeOrigin
timeOrigin указывает отметку времени в миллисекундах с высокой точностью, в момент начала текущего процесса node, измеренную в Unix time.
performance.timerify(fn[, options])
-
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()
Объект, представляющий собой JSON-представление объекта performance. Он похож на window.performance.toJSON в браузерах.
Событие: 'resourcetimingbufferfull'
Событие 'resourcetimingbufferfull' срабатывает, когда глобальный буфер временных данных ресурсов производительности заполнен. Измените размер буфера временных данных ресурсов с помощью performance.setResourceTimingBufferSize() или очистите буфер с помощью performance.clearResourceTimings() в обработчике событий, чтобы позволить добавление большего количества записей в буфер временной шкалы производительности.
Класс: PerformanceEntry
performanceEntry.detail
Дополнительные сведения, специфичные для entryType.
performanceEntry.duration
Общее количество миллисекунд, затраченное на эту запись. Это значение не будет иметь смысла для всех типов записей Performance Entry.
performanceEntry.entryType
Тип записи производительности. Он может быть одним из:
-
'node'(только Node.js) -
'mark'(доступно в браузере) -
'measure'(доступно в браузере) -
'gc'(только Node.js) -
'function'(только Node.js) -
'http2'(только Node.js) -
'http'(только Node.js)
performanceEntry.flags
Это свойство является расширением Node.js. Оно недоступно в браузерах.
Когда 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
performanceEntry.name
Имя записи производительности.
performanceEntry.kind
Это свойство является расширением Node.js. Оно недоступно в браузерах.
Когда 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
performanceEntry.startTime
Маркер временной метки высокой точности в миллисекундах, обозначающий начальное время записи Performance Entry.
Подробности сборки мусора ('gc')
Когда performanceEntry.type равно 'gc', свойство performanceEntry.detail будет объектом <объект> с двумя свойствами:
-
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
-
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
Подробности 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<число> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи приёмом первого кадраDATA. -
timeToFirstByteSent<число> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи отправкой первого кадраDATA. -
timeToFirstHeader<число> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи приёмом первого заголовка.
Если 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
- Расширяет: <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
Маркер времени в миллисекундах высокой точности, представляющий время непосредственно перед началом процесса установления защищённого соединения.
performanceResourceTiming.requestStart
Маркер времени в миллисекундах высокой точности, представляющий время непосредственно перед получением Node.js первого байта ответа от сервера.
performanceResourceTiming.responseEnd
Маркер времени в миллисекундах высокой точности, представляющий время сразу после получения Node.js последнего байта ресурса или непосредственно перед закрытием транспортного соединения, что произойдёт первым.
performanceResourceTiming.transferSize
Число, представляющее размер (в октетах) полученного ресурса. Размер включает поля заголовка ответа плюс тело полезной нагрузки ответа.
performanceResourceTiming.encodedBodySize
Число, представляющее размер (в октетах) полученное от выполнения (HTTP или кеша), тела полезной нагрузки перед удалением применённых кодировок содержимого.
performanceResourceTiming.decodedBodySize
Число, представляющее размер (в октетах) полученное от выполнения (HTTP или кеша), тела сообщения после удаления применённых кодировок содержимого.
performanceResourceTiming.toJSON()
Возвращает строку object, которая является JSON-представлением объекта PerformanceResourceTiming
Класс: perf_hooks.PerformanceObserver
PerformanceObserver.supportedEntryTypes
Получить поддерживаемые типы.
new PerformanceObserver(callback)
-
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()
Отключает экземпляр 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
* },
* 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])
-
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)
-
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])
-
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
Возвращает объект Map, отображающий накопленное распределение процентилей.
histogram.percentilesBigInt
Возвращает объект Map, отображающий накопленное распределение процентилей.
histogram.reset()
Сбрасывает собранные данные гистограммы.
Стандартное отклонение histogram.stddev
Стандартное отклонение зарегистрированных задержек цикла событий.
Класс: IntervalHistogram extends Histogram
Периодически обновляемая Histogram на заданном интервале.
histogram.disable()
- Возвращает: <boolean>
Отключает таймер интервала обновления. Возвращает true, если таймер был остановлен, false, если он уже был остановлен.
histogram.enable()
- Возвращает: <boolean>
Включает таймер интервала обновления. Возвращает 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/dist/latest-v18.x/docs/api/perf_hooks.html