API измерения производительности
Исходный код: lib/perf_hooks.js
Этот модуль предоставляет реализацию подмножества W3C API производительности веб-страниц, а также дополнительные API для измерений производительности, специфичных для Node.js.
Node.js поддерживает следующие API производительности веб-страниц:
- Высокоточные измерения времени
- Временная шкала производительности
- Измерение времени пользователя
- Измерение времени ресурсов
const { PerformanceObserver, performance } = require('node:perf_hooks');
const obs = new PerformanceObserver((items) => {
console.log(items.getEntries()[0].duration);
performance.clearMarks();
});
obs.observe({ type: 'measure' });
performance.measure('Start to Now');
performance.mark('A');
doSomeLongRunningProcess(() => {
performance.measure('A to Now', 'A');
performance.mark('B');
performance.measure('A to B', 'A', 'B');
}); copy
perf_hooks.performance
Объект, который можно использовать для сбора метрик производительности текущего экземпляра 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<Объект> Информация о тайминге запроса -
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<строка> -
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. Оно недоступно в браузерах.
Оборачивает функцию в новую функцию, измеряющую время выполнения обернутой функции. Для доступа к данным тайминга необходимо подписаться на тип события 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 в браузерах.
Event: 'resourcetimingbufferfull'
Событие 'resourcetimingbufferfull' срабатывает, когда глобальный буфер тайминга ресурсов производительности заполнен. Измените размер буфера тайминга ресурсов с помощью performance.setResourceTimingBufferSize() или очистите буфер с помощью performance.clearResourceTimings() в обработчике событий, чтобы разрешить добавление большего количества записей в буфер таймлайна производительности.
Класс: PerformanceEntry
Конструктор этого класса не предоставляется пользователю напрямую.
performanceEntry.duration
Общее количество миллисекунд, прошедших для этой записи. Это значение не будет иметь смысла для всех типов записей Performance.
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 будет <объектом> с двумя свойствами:
-
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', свойство performanceNodeEntry.detail будет <объектом>, содержащим дополнительную информацию.
Если performanceEntry.name равно HttpClient, свойство detail будет содержать следующие свойства: req, res. А свойство req будет <объектом>, содержащим method, url, headers, свойство res будет <объектом>, содержащим statusCode, statusMessage, headers.
Если performanceEntry.name равно HttpRequest, свойство detail будет содержать следующие свойства: req, res. А свойство req будет <объектом>, содержащим method, url, headers, свойство res будет <объектом>, содержащим statusCode, statusMessage, headers.
Это может добавить дополнительную нагрузку на память и должно использоваться только для диагностических целей, а не оставляться включенным по умолчанию в рабочей среде.
Подробности HTTP/2 ('http2')
Когда performanceEntry.type равно 'http2', свойство performanceNodeEntry.detail будет <объектом>, содержащим дополнительную информацию о производительности.
Если performanceEntry.name равно Http2Stream, свойство detail будет содержать следующие свойства:
-
bytesRead<число> Количество байтов фреймаDATAполучено для этойHttp2Stream. -
bytesWritten<число> Количество байтов фреймаDATAотправлено для этойHttp2Stream. -
id<число> Идентификатор связаннойHttp2Stream -
timeToFirstByte<число> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи приёмом первого фреймаDATA. -
timeToFirstByteSent<число> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи отправкой первого фреймаDATA. -
timeToFirstHeader<число> Количество миллисекунд, прошедших междуPerformanceEntrystartTimeи приёмом первого заголовка.
Если performanceEntry.name равно Http2Session, свойство detail будет содержать следующие свойства:
-
bytesRead<число> Количество полученных байтов для этойHttp2Session. -
bytesWritten<число> Количество отправленных байтов для этойHttp2Session. -
framesReceived<число> Количество полученных фреймов HTTP/2Http2Session. -
framesSent<число> Количество отправленных фреймов HTTP/2Http2Session. -
maxConcurrentStreams<число> Максимальное количество потоков, одновременно открытых за время жизниHttp2Session. -
pingRTT<число> Количество миллисекунд, прошедших с момента передачи фреймаPINGи получения его подтверждения. Присутствует только в случае отправки фреймаPINGнаHttp2Session. -
streamAverageDuration<число> Среднее время (в миллисекундах) для всехHttp2Streamэкземпляров. -
streamCount<число> Количество обработанныхHttp2StreamэкземпляровHttp2Session. -
type<строка> Либо'server'или'client'для идентификации типаHttp2Session.
Подробности Timerify ('функция')
Когда performanceEntry.type равно 'function', свойство performanceNodeEntry.detail будет <массивом>, перечисляющим входные аргументы отслеживаемой функции.
Подробности Net ('net')
Когда performanceEntry.type равно 'net', свойство performanceNodeEntry.detail будет объектом <Объект>, содержащим дополнительную информацию.
Если performanceEntry.name равно connect, свойство detail будет содержать следующие свойства: host, port.
Подробности DNS ('dns')
Когда performanceEntry.type равно 'dns', свойство performanceNodeEntry.detail будет объектом <Объект>, содержащим дополнительную информацию.
Если performanceEntry.name равно lookup, свойство detail будет содержать следующие свойства: hostname, family, hints, verbatim, addresses.
Если performanceEntry.name равно lookupService, или detail будет содержать следующие свойства: host, port, hostname, service.
Если performanceEntry.name равно queryxxx или getHostByAddr, свойство detail будет содержать следующие свойства: host, ttl, result. Значение result совпадает с результатом queryxxx или getHostByAddr.
Класс: PerformanceNodeTiming
- Расширяет: <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
Маркер времени в миллисекундах с высокой точностью, представляющий время сразу после получения Node.js последнего байта ресурса или непосредственно перед закрытием транспортного соединения (в зависимости от того, что произойдет раньше).
performanceResourceTiming.transferSize
Число, представляющее размер (в октетах) загруженного ресурса. Размер включает поля заголовка ответа и тело полезной нагрузки ответа.
performanceResourceTiming.encodedBodySize
Число, представляющее размер (в октетах) тела полезной нагрузки, полученного при загрузке (HTTP или кэш), до удаления применённых кодировок контента.
performanceResourceTiming.decodedBodySize
Число, представляющее размер (в октетах) тела сообщения, полученного при загрузке (HTTP или кэш), после удаления применённых кодировок контента.
performanceResourceTiming.toJSON()
Возвращает object, представляющий JSON-представление объекта PerformanceResourceTiming.
Класс: 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,
* 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()
- Возвращает: <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-v20.x/docs/api/perf_hooks.html