API для измерения производительности
[Стабильно: 2 - Стабильно]
Стабильно: 2 Стабильность: 2 - Стабильно
Исходный код: lib/perf_hooks.js
Этот модуль предоставляет реализацию подмножества W3C Web Performance APIs, а также дополнительные API для измерений производительности, специфичных для Node.js.
Node.js поддерживает следующие Web Performance APIs:
import { performance, PerformanceObserver } from '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');
});
const { PerformanceObserver, performance } = require('node:perf_hooks');
const obs = new PerformanceObserver((items) => {
console.log(items.getEntries()[0].duration);
});
obs.observe({ type: 'measure' });
performance.measure('Start to Now');
performance.mark('A');
(async function doSomeLongRunningProcess() {
await new Promise((r) => setTimeout(r, 5000));
performance.measure('A to Now', 'A');
performance.mark('B');
performance.measure('A to B', 'A', 'B');
})();
perf_hooks.performance
Добавлено в: v8.5.0
Объект, который может быть использован для сбора метрик производительности из текущего экземпляра Node.js. Он похож на window.performance
в браузерах.
performance.clearMarks([name])
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v8.5.0 | Добавлено в: v8.5.0 |
name
<string>
Если name
не указано, удаляет все объекты PerformanceMark
из Timeline производительности. Если name
указано, удаляет только указанную метку.
performance.clearMeasures([name])
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v16.7.0 | Добавлено в: v16.7.0 |
name
<string>
Если name
не указано, удаляет все объекты PerformanceMeasure
из Timeline производительности. Если name
указано, удаляет только указанное измерение.
performance.clearResourceTimings([name])
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
name
<string>
Если name
не указано, удаляет все объекты PerformanceResourceTiming
из Timeline ресурсов. Если name
указано, удаляет только указанный ресурс.
performance.eventLoopUtilization([utilization1[, utilization2]])
Добавлено в: v14.10.0, v12.19.0
utilization1
<Object> Результат предыдущего вызоваeventLoopUtilization()
.utilization2
<Object> Результат предыдущего вызоваeventLoopUtilization()
доutilization1
.- Возвращает: <Object>
Метод eventLoopUtilization()
возвращает объект, содержащий совокупную продолжительность времени, в течение которого цикл событий был как в состоянии простоя, так и активным, в виде таймера высокого разрешения в миллисекундах. Значение utilization
является вычисленным использованием цикла событий (ELU).
Если начальная загрузка еще не завершена в основном потоке, свойства имеют значение 0
. ELU немедленно доступен в Worker threads, поскольку начальная загрузка происходит внутри цикла событий.
Оба параметра utilization1
и utilization2
являются необязательными.
Если передан параметр utilization1
, то вычисляется и возвращается дельта между active
и idle
временами текущего вызова, а также соответствующее значение utilization
(аналогично process.hrtime()
).
Если переданы оба параметра utilization1
и utilization2
, то дельта вычисляется между двумя аргументами. Это удобная опция, поскольку, в отличие от process.hrtime()
, вычисление ELU более сложное, чем простое вычитание.
ELU аналогичен использованию ЦП, за исключением того, что он измеряет только статистику цикла событий, а не использование ЦП. Он представляет собой процент времени, в течение которого цикл событий провел вне провайдера событий цикла событий (например, epoll_wait
). Никакое другое время простоя ЦП не принимается во внимание. Ниже приведен пример того, как в основном простаивающий процесс будет иметь высокий ELU.
import { eventLoopUtilization } from 'node:perf_hooks';
import { spawnSync } from 'node:child_process';
setImmediate(() => {
const elu = eventLoopUtilization();
spawnSync('sleep', ['5']);
console.log(eventLoopUtilization(elu).utilization);
});
'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);
});
Хотя ЦП в основном простаивает во время выполнения этого скрипта, значение utilization
равно 1
. Это связано с тем, что вызов child_process.spawnSync()
блокирует цикл событий от продолжения.
Передача пользовательского объекта вместо результата предыдущего вызова eventLoopUtilization()
приведет к неопределенному поведению. Не гарантируется, что возвращаемые значения будут отражать какое-либо правильное состояние цикла событий.
performance.getEntries()
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v16.7.0 | Добавлено в версии: v16.7.0 |
- Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry
в хронологическом порядке относительно performanceEntry.startTime
. Если вас интересуют только записи производительности определенных типов или с определенными именами, см. performance.getEntriesByType()
и performance.getEntriesByName()
.
performance.getEntriesByName(name[, type])
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v16.7.0 | Добавлено в версии: v16.7.0 |
name
<string>type
<string>- Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry
в хронологическом порядке относительно performanceEntry.startTime
, у которых performanceEntry.name
равен name
, и, при необходимости, у которых performanceEntry.entryType
равен type
.
performance.getEntriesByType(type)
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v16.7.0 | Добавлено в версии: v16.7.0 |
type
<string>- Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry
в хронологическом порядке относительно performanceEntry.startTime
, у которых performanceEntry.entryType
равен type
.
performance.mark(name[, options])
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. Аргумент name больше не является необязательным. |
v16.0.0 | Обновлено в соответствии со спецификацией User Timing Level 3. |
v8.5.0 | Добавлено в версии: v8.5.0 |
Создает новую запись PerformanceMark
в Performance Timeline. PerformanceMark
является подклассом PerformanceEntry
, у которого performanceEntry.entryType
всегда равно 'mark'
, а performanceEntry.duration
всегда равно 0
. Отметки производительности используются для обозначения определенных важных моментов в Performance Timeline.
Созданная запись PerformanceMark
помещается в глобальную Performance Timeline и может быть запрошена с помощью performance.getEntries
, performance.getEntriesByName
и performance.getEntriesByType
. При выполнении наблюдения записи должны быть удалены из глобальной Performance Timeline вручную с помощью performance.clearMarks
.
performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, global, cacheMode, bodyInfo, responseStatus[, deliveryType])
[История]
Версия | Изменения |
---|---|
v22.2.0 | Добавлены аргументы bodyInfo, responseStatus и deliveryType. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
timingInfo
<Object> Информация о времени полученияrequestedUrl
<string> URL ресурсаinitiatorType
<string> Имя инициатора, например: 'fetch'global
<Object>cacheMode
<string> Режим кэширования должен быть пустой строкой ('') или 'local'bodyInfo
<Object> Информация о теле ответа FetchresponseStatus
<number> Код состояния ответаdeliveryType
<string> Тип доставки. По умолчанию:''
.
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Создает новую запись PerformanceResourceTiming
в временной шкале ресурсов. PerformanceResourceTiming
является подклассом PerformanceEntry
, у которого performanceEntry.entryType
всегда 'resource'
. Ресурсы производительности используются для отметки моментов во временной шкале ресурсов.
Созданная запись PerformanceMark
помещается в глобальную временную шкалу ресурсов и может быть запрошена с помощью performance.getEntries
, performance.getEntriesByName
и performance.getEntriesByType
. Когда наблюдение выполнено, записи должны быть очищены из глобальной временной шкалы производительности вручную с помощью performance.clearResourceTimings
.
performance.measure(name[, startMarkOrOptions[, endMark]])
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v16.0.0 | Обновлено в соответствии со спецификацией User Timing Level 3. |
v13.13.0, v12.16.3 | Сделать параметры startMark и endMark необязательными. |
v8.5.0 | Добавлено в: v8.5.0 |
name
<string>startMarkOrOptions
<string> | <Object> Необязательный.detail
<any> Дополнительная необязательная информация, включаемая в измерение.duration
<number> Продолжительность между временем начала и окончания.end
<number> | <string> Временная метка, используемая в качестве времени окончания, или строка, идентифицирующая ранее записанную метку.start
<number> | <string> Временная метка, используемая в качестве времени начала, или строка, идентифицирующая ранее записанную метку.
endMark
<string> Необязательный. Должен быть опущен, еслиstartMarkOrOptions
является <Object>.
Создает новую запись PerformanceMeasure
в Performance Timeline. PerformanceMeasure
является подклассом PerformanceEntry
, у которого performanceEntry.entryType
всегда 'measure'
, а performanceEntry.duration
измеряет количество миллисекунд, прошедших между startMark
и endMark
.
Аргумент startMark
может идентифицировать любую существующую PerformanceMark
в Performance Timeline, или может идентифицировать любое из свойств временной метки, предоставляемых классом PerformanceNodeTiming
. Если именованная startMark
не существует, возникает ошибка.
Необязательный аргумент endMark
должен идентифицировать любую существующую PerformanceMark
в Performance Timeline или любое из свойств временной метки, предоставляемых классом PerformanceNodeTiming
. endMark
будет performance.now()
, если параметр не передан, в противном случае, если именованная endMark
не существует, будет выдана ошибка.
Созданная запись PerformanceMeasure
помещается в глобальную Performance Timeline и может быть запрошена с помощью performance.getEntries
, performance.getEntriesByName
и performance.getEntriesByType
. Когда наблюдение выполнено, записи должны быть удалены из глобальной Performance Timeline вручную с помощью performance.clearMeasures
.
performance.nodeTiming
Добавлено в: v8.5.0
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Экземпляр класса PerformanceNodeTiming
, который предоставляет метрики производительности для конкретных операционных этапов Node.js.
performance.now()
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v8.5.0 | Добавлено в: v8.5.0 |
- Возвращает: <number>
Возвращает текущую метку времени в миллисекундах с высоким разрешением, где 0 представляет начало текущего процесса node
.
performance.setResourceTimingBufferSize(maxSize)
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v18.8.0 | Добавлено в: v18.8.0 |
Устанавливает глобальный размер буфера времени ресурсов производительности на указанное количество объектов записи производительности типа "ресурс".
По умолчанию максимальный размер буфера установлен на 250.
performance.timeOrigin
Добавлено в: v8.5.0
timeOrigin
указывает метку времени в миллисекундах с высоким разрешением, когда начался текущий процесс node
, измеренную в Unix time.
performance.timerify(fn[, options])
[История]
Версия | Изменения |
---|---|
v16.0.0 | Добавлена опция histogram. |
v16.0.0 | Перереализовано с использованием чистого JavaScript и возможностью отслеживать время асинхронных функций. |
v8.5.0 | Добавлено в: v8.5.0 |
fn
<Function>options
<Object>histogram
<RecordableHistogram> Объект гистограммы, созданный с помощьюperf_hooks.createHistogram()
, который будет записывать продолжительность выполнения в наносекундах.
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Оборачивает функцию в новую функцию, которая измеряет время выполнения обернутой функции. PerformanceObserver
должен быть подписан на тип события 'function'
, чтобы можно было получить доступ к деталям времени.
import { performance, PerformanceObserver } from '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();
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();
Если обернутая функция возвращает промис, к промису будет прикреплен обработчик finally, и продолжительность будет сообщена после вызова обработчика finally.
performance.toJSON()
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v16.1.0 | Добавлено в: v16.1.0 |
Объект, являющийся JSON-представлением объекта performance
. Он похож на window.performance.toJSON
в браузерах.
Событие: 'resourcetimingbufferfull'
Добавлено в: v18.8.0
Событие 'resourcetimingbufferfull'
возникает, когда глобальный буфер времени ресурсов производительности заполнен. Отрегулируйте размер буфера времени ресурсов с помощью performance.setResourceTimingBufferSize()
или очистите буфер с помощью performance.clearResourceTimings()
в обработчике событий, чтобы разрешить добавление дополнительных записей в буфер временной шкалы производительности.
Класс: PerformanceEntry
Добавлено в: v8.5.0
Конструктор этого класса напрямую недоступен пользователям.
performanceEntry.duration
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceEntry в качестве получателя. |
v8.5.0 | Добавлено в: v8.5.0 |
Общее количество миллисекунд, прошедших для этой записи. Это значение не будет значимым для всех типов записей производительности.
performanceEntry.entryType
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceEntry в качестве получателя. |
v8.5.0 | Добавлено в: v8.5.0 |
Тип записи производительности. Он может быть одним из:
'dns'
(только Node.js)'function'
(только Node.js)'gc'
(только Node.js)'http2'
(только Node.js)'http'
(только Node.js)'mark'
(доступно в Web)'measure'
(доступно в Web)'net'
(только Node.js)'node'
(только Node.js)'resource'
(доступно в Web)
performanceEntry.name
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceEntry в качестве получателя. |
v8.5.0 | Добавлено в: v8.5.0 |
Имя записи производительности.
performanceEntry.startTime
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceEntry в качестве получателя. |
v8.5.0 | Добавлено в: v8.5.0 |
Метка времени в миллисекундах высокого разрешения, отмечающая время начала записи производительности.
Класс: PerformanceMark
Добавлено в: v18.2.0, v16.17.0
- Расширяет: <PerformanceEntry>
Предоставляет доступ к меткам, созданным с помощью метода Performance.mark()
.
performanceMark.detail
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceMark в качестве получателя. |
v16.0.0 | Добавлено в: v16.0.0 |
Дополнительные детали, указанные при создании с помощью метода Performance.mark()
.
Класс: PerformanceMeasure
Добавлено в: v18.2.0, v16.17.0
- Расширяет: <PerformanceEntry>
Предоставляет доступ к измерениям, созданным с помощью метода Performance.measure()
.
Конструктор этого класса напрямую не предоставляется пользователям.
performanceMeasure.detail
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceMeasure в качестве получателя. |
v16.0.0 | Добавлено в: v16.0.0 |
Дополнительные детали, указанные при создании с помощью метода Performance.measure()
.
Класс: PerformanceNodeEntry
Добавлено в: v19.0.0
- Наследует: <PerformanceEntry>
Этот класс является расширением Node.js. Он недоступен в веб-браузерах.
Предоставляет подробные данные о времени выполнения Node.js.
Конструктор этого класса не предоставляется пользователям напрямую.
performanceNodeEntry.detail
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceNodeEntry в качестве получателя. |
v16.0.0 | Добавлено в: v16.0.0 |
Дополнительные детали, специфичные для entryType
.
performanceNodeEntry.flags
[История]
Версия | Изменения |
---|---|
v16.0.0 | Устарело во время выполнения. Теперь перемещено в свойство detail, когда entryType имеет значение 'gc'. |
v13.9.0, v12.17.0 | Добавлено в: v13.9.0, v12.17.0 |
[Stable: 0 - Deprecated]
Stable: 0 Стабильность: 0 - Устарело: используйте performanceNodeEntry.detail
вместо этого.
Когда performanceEntry.entryType
равно 'gc'
, свойство performance.flags
содержит дополнительную информацию об операции сборки мусора. Значение может быть одним из:
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NO
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCED
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE
performanceNodeEntry.kind
[История]
Версия | Изменения |
---|---|
v16.0.0 | Устарело во время выполнения. Теперь перемещено в свойство detail, когда entryType имеет значение 'gc'. |
v8.5.0 | Добавлено в: v8.5.0 |
[Stable: 0 - Deprecated]
Stable: 0 Стабильность: 0 - Устарело: используйте performanceNodeEntry.detail
вместо этого.
Когда performanceEntry.entryType
равно 'gc'
, свойство performance.kind
идентифицирует тип операции сборки мусора, которая произошла. Значение может быть одним из:
perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR
perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR
perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL
perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
Детали сборки мусора ('gc')
Когда performanceEntry.type
равно 'gc'
, свойство performanceNodeEntry.detail
будет <Object> с двумя свойствами:
kind
<number> Одно из:perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR
perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR
perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL
perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
flags
<number> Одно из:perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NO
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCED
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY
perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE
Детали HTTP ('http')
Когда performanceEntry.type
равно 'http'
, свойство performanceNodeEntry.detail
будет <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> Количество миллисекунд, прошедшее междуstartTime
PerformanceEntry
и получением первого фреймаDATA
.timeToFirstByteSent
<number> Количество миллисекунд, прошедшее междуstartTime
PerformanceEntry
и отправкой первого фреймаDATA
.timeToFirstHeader
<number> Количество миллисекунд, прошедшее междуstartTime
PerformanceEntry
и получением первого заголовка.
Если 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') Details
Когда performanceEntry.type
равен 'function'
, свойство performanceNodeEntry.detail
будет <Array>, содержащим список входных аргументов синхронизируемой функции.
Net ('net') Details
Когда performanceEntry.type
равен 'net'
, свойство performanceNodeEntry.detail
будет <Object>, содержащим дополнительную информацию.
Если performanceEntry.name
равен connect
, свойство detail
будет содержать следующие свойства: host
, port
.
DNS ('dns') Details
Когда performanceEntry.type
равен 'dns'
, свойство performanceNodeEntry.detail
будет <Object>, содержащим дополнительную информацию.
Если 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
.
Class: PerformanceNodeTiming
Added in: v8.5.0
- Extends: <PerformanceEntry>
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Предоставляет детали синхронизации для самого Node.js. Конструктор этого класса недоступен для пользователей.
performanceNodeTiming.bootstrapComplete
Added in: v8.5.0
Метка времени в миллисекундах с высоким разрешением, в момент завершения процесса начальной загрузки Node.js. Если начальная загрузка еще не завершена, свойство имеет значение -1.
performanceNodeTiming.environment
Добавлено в версии: v8.5.0
Высокоточное значение времени в миллисекундах, когда была инициализирована среда Node.js.
performanceNodeTiming.idleTime
Добавлено в версии: v14.10.0, v12.19.0
Высокоточное значение времени в миллисекундах, показывающее, сколько времени цикл событий простаивал в поставщике событий цикла событий (например, epoll_wait
). Это не учитывает использование ЦП. Если цикл событий еще не начался (например, в первом тике основного скрипта), свойство имеет значение 0.
performanceNodeTiming.loopExit
Добавлено в версии: v8.5.0
Высокоточное значение времени в миллисекундах, когда цикл событий Node.js завершился. Если цикл событий еще не завершился, свойство имеет значение -1. Оно может иметь значение, отличное от -1, только в обработчике события 'exit'
.
performanceNodeTiming.loopStart
Добавлено в версии: v8.5.0
Высокоточное значение времени в миллисекундах, когда цикл событий Node.js начался. Если цикл событий еще не начался (например, в первом тике основного скрипта), свойство имеет значение -1.
performanceNodeTiming.nodeStart
Добавлено в версии: v8.5.0
Высокоточное значение времени в миллисекундах, когда был инициализирован процесс Node.js.
performanceNodeTiming.uvMetricsInfo
Добавлено в версии: v22.8.0, v20.18.0
- Возвращает: <Object>
Это обертка для функции uv_metrics_info
. Она возвращает текущий набор метрик цикла событий.
Рекомендуется использовать это свойство внутри функции, выполнение которой было запланировано с помощью setImmediate
, чтобы избежать сбора метрик до завершения всех операций, запланированных во время текущей итерации цикла.
const { performance } = require('node:perf_hooks');
setImmediate(() => {
console.log(performance.nodeTiming.uvMetricsInfo);
});
import { performance } from 'node:perf_hooks';
setImmediate(() => {
console.log(performance.nodeTiming.uvMetricsInfo);
});
performanceNodeTiming.v8Start
Добавлено в версии: v8.5.0
Высокоточное значение метки времени в миллисекундах, когда была инициализирована платформа V8.
Класс: PerformanceResourceTiming
Добавлено в версии: v18.2.0, v16.17.0
- Наследует: <PerformanceEntry>
Предоставляет подробные данные о времени сетевых операций, касающихся загрузки ресурсов приложения.
Конструктор этого класса напрямую недоступен для пользователей.
performanceResourceTiming.workerStart
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод получения свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в версии: v18.2.0, v16.17.0 |
Высокоточное значение метки времени в миллисекундах непосредственно перед отправкой запроса fetch
. Если ресурс не перехватывается воркером, свойство всегда будет возвращать 0.
performanceResourceTiming.redirectStart
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод получения свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в версии: v18.2.0, v16.17.0 |
Высокоточное значение метки времени в миллисекундах, представляющее время начала выборки (fetch), которая инициирует перенаправление.
performanceResourceTiming.redirectEnd
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод получения свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в версии: v18.2.0, v16.17.0 |
Высокоточное значение метки времени в миллисекундах, которое будет создано сразу после получения последнего байта ответа последнего перенаправления.
performanceResourceTiming.fetchStart
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Высокоточное представление времени в миллисекундах непосредственно перед тем, как Node.js начинает выборку ресурса.
performanceResourceTiming.domainLookupStart
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Высокоточное представление времени в миллисекундах непосредственно перед тем, как Node.js начинает поиск доменного имени для ресурса.
performanceResourceTiming.domainLookupEnd
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Высокоточное представление времени в миллисекундах, представляющее время сразу после того, как Node.js завершил поиск доменного имени для ресурса.
performanceResourceTiming.connectStart
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Высокоточное представление времени в миллисекундах, представляющее время непосредственно перед тем, как Node.js начинает устанавливать соединение с сервером для получения ресурса.
performanceResourceTiming.connectEnd
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Высокоточное представление временной метки в миллисекундах, представляющее время сразу после того, как Node.js завершает установление соединения с сервером для получения ресурса.
performanceResourceTiming.secureConnectionStart
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Высокоточное представление временной метки в миллисекундах, представляющее время непосредственно перед тем, как Node.js начинает процесс подтверждения для защиты текущего соединения.
performanceResourceTiming.requestStart
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Высокоточное представление временной метки в миллисекундах, представляющее время непосредственно перед тем, как Node.js получает первый байт ответа от сервера.
performanceResourceTiming.responseEnd
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот геттер свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Высокоточное представление временной метки в миллисекундах, представляющее время сразу после того, как Node.js получает последний байт ресурса или непосредственно перед закрытием транспортного соединения, в зависимости от того, что произойдет раньше.
performanceResourceTiming.transferSize
[История]
Версия | Изменения |
---|---|
v19.0.0 | Геттер этого свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Число, представляющее размер (в октетах) полученного ресурса. Размер включает поля заголовка ответа плюс тело полезной нагрузки ответа.
performanceResourceTiming.encodedBodySize
[История]
Версия | Изменения |
---|---|
v19.0.0 | Геттер этого свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Число, представляющее размер (в октетах), полученный при выборке (HTTP или кеш), тела полезной нагрузки, до удаления каких-либо примененных кодировок содержимого.
performanceResourceTiming.decodedBodySize
[История]
Версия | Изменения |
---|---|
v19.0.0 | Геттер этого свойства должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Число, представляющее размер (в октетах), полученный при выборке (HTTP или кеш), тела сообщения, после удаления каких-либо примененных кодировок содержимого.
performanceResourceTiming.toJSON()
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом PerformanceResourceTiming в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
Возвращает object
, который является JSON-представлением объекта PerformanceResourceTiming
.
Класс: PerformanceObserver
Добавлено в: v8.5.0
PerformanceObserver.supportedEntryTypes
Добавлено в: v16.0.0
Получить поддерживаемые типы.
new PerformanceObserver(callback)
[История]
Версия | Изменения |
---|---|
v18.0.0 | Передача недействительного обратного вызова в аргумент callback теперь вызывает ERR_INVALID_ARG_TYPE вместо ERR_INVALID_CALLBACK . |
v8.5.0 | Добавлено в: v8.5.0 |
callback
<Function>list
<PerformanceObserverEntryList>observer
<PerformanceObserver>
Объекты PerformanceObserver
предоставляют уведомления при добавлении новых экземпляров PerformanceEntry
в Performance Timeline.
import { performance, PerformanceObserver } from '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');
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');
Поскольку экземпляры PerformanceObserver
создают свои собственные дополнительные накладные расходы на производительность, экземпляры не следует оставлять подписанными на уведомления на неопределенный срок. Пользователи должны отключать наблюдатели, как только они больше не нужны.
callback
вызывается, когда PerformanceObserver
получает уведомление о новых экземплярах PerformanceEntry
. Обратный вызов получает экземпляр PerformanceObserverEntryList
и ссылку на PerformanceObserver
.
performanceObserver.disconnect()
Добавлено в: v8.5.0
Отключает экземпляр PerformanceObserver
от всех уведомлений.
performanceObserver.observe(options)
[История]
Версия | Изменения |
---|---|
v16.7.0 | Обновлено в соответствии с Performance Timeline Level 2. Опция buffered была добавлена обратно. |
v16.0.0 | Обновлено в соответствии с User Timing Level 3. Опция buffered была удалена. |
v8.5.0 | Добавлено в: v8.5.0 |
options
<Object>type
<string> Один тип <PerformanceEntry>. Не должен быть указан, еслиentryTypes
уже задан.entryTypes
<string[]> Массив строк, определяющих типы экземпляров <PerformanceEntry>, которые интересуют наблюдателя. Если не указан, будет выдана ошибка.buffered
<boolean> Если true, обратный вызов наблюдателя вызывается со списком глобальныхPerformanceEntry
, буферизованных записей. Если false, толькоPerformanceEntry
, созданные после указанного момента времени, отправляются в обратный вызов наблюдателя. По умолчанию:false
.
Подписывает экземпляр <PerformanceObserver> на уведомления о новых экземплярах <PerformanceEntry>, идентифицируемых либо options.entryTypes
, либо options.type
:
import { performance, PerformanceObserver } from 'node:perf_hooks';
const obs = new PerformanceObserver((list, observer) => {
// Вызывается один раз асинхронно. `list` содержит три элемента.
});
obs.observe({ type: 'mark' });
for (let n = 0; n < 3; n++)
performance.mark(`test${n}`);
const {
performance,
PerformanceObserver,
} = require('node:perf_hooks');
const obs = new PerformanceObserver((list, observer) => {
// Вызывается один раз асинхронно. `list` содержит три элемента.
});
obs.observe({ type: 'mark' });
for (let n = 0; n < 3; n++)
performance.mark(`test${n}`);
performanceObserver.takeRecords()
Добавлено в версии: v16.0.0
- Возвращает: <PerformanceEntry[]> Текущий список записей, хранящихся в наблюдателе производительности, очищая его.
Класс: PerformanceObserverEntryList
Добавлено в версии: v8.5.0
Класс PerformanceObserverEntryList
используется для предоставления доступа к экземплярам PerformanceEntry
, переданным в PerformanceObserver
. Конструктор этого класса не предоставляется пользователям.
performanceObserverEntryList.getEntries()
Добавлено в версии: v8.5.0
- Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry
в хронологическом порядке относительно performanceEntry.startTime
.
import { performance, PerformanceObserver } from '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');
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');
performanceObserverEntryList.getEntriesByName(name[, type])
Добавлено в: v8.5.0
name
<string>type
<string>- Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry
в хронологическом порядке относительно performanceEntry.startTime
, чье свойство performanceEntry.name
равно name
, и, необязательно, чье свойство performanceEntry.entryType
равно type
.
import { performance, PerformanceObserver } from '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');
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');
performanceObserverEntryList.getEntriesByType(type)
Добавлено в версии: v8.5.0
type
<string>- Возвращает: <PerformanceEntry[]>
Возвращает список объектов PerformanceEntry
в хронологическом порядке относительно performanceEntry.startTime
, у которых performanceEntry.entryType
равен type
.
import { performance, PerformanceObserver } from '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');
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');
perf_hooks.createHistogram([options])
Добавлено в версии: v15.9.0, v14.18.0
options
<Object>lowest
<number> | <bigint> Наименьшее различимое значение. Должно быть целым числом больше 0. По умолчанию:1
.highest
<number> | <bigint> Наибольшее записываемое значение. Должно быть целым числом, равным или превышающим двукратное значениеlowest
. По умолчанию:Number.MAX_SAFE_INTEGER
.figures
<number> Количество значащих цифр. Должно быть числом от1
до5
. По умолчанию:3
.
Возвращает: <RecordableHistogram>
Возвращает <RecordableHistogram>.
perf_hooks.monitorEventLoopDelay([options])
Добавлено в: v11.10.0
options
<Object>resolution
<number> Частота выборки в миллисекундах. Должна быть больше нуля. По умолчанию:10
.
Возвращает: <IntervalHistogram>
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Создает объект IntervalHistogram
, который отбирает и сообщает задержку цикла событий с течением времени. Задержки будут сообщаться в наносекундах.
Использование таймера для обнаружения приблизительной задержки цикла событий работает, потому что выполнение таймеров связано конкретно с жизненным циклом цикла событий libuv. То есть задержка в цикле вызовет задержку в выполнении таймера, и именно эти задержки предназначены для обнаружения этим API.
import { monitorEventLoopDelay } from 'node:perf_hooks';
const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
// Что-то сделать.
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));
const { monitorEventLoopDelay } = require('node:perf_hooks');
const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
// Что-то сделать.
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));
Класс: Histogram
Добавлено в: v11.10.0
histogram.count
Добавлено в: v17.4.0, v16.14.0
Количество выборок, записанных гистограммой.
histogram.countBigInt
Добавлено в: v17.4.0, v16.14.0
Количество выборок, записанных гистограммой.
histogram.exceeds
Добавлено в: v11.10.0
Количество случаев, когда задержка цикла событий превысила максимальный порог задержки цикла событий в 1 час.
histogram.exceedsBigInt
Добавлено в: v17.4.0, v16.14.0
Количество случаев, когда задержка цикла событий превысила максимальный порог задержки цикла событий в 1 час.
histogram.max
Добавлено в: v11.10.0
Максимальная зарегистрированная задержка цикла событий.
histogram.maxBigInt
Добавлено в: v17.4.0, v16.14.0
Максимальная зарегистрированная задержка цикла событий.
histogram.mean
Добавлено в: v11.10.0
Среднее значение зарегистрированных задержек цикла событий.
histogram.min
Добавлено в: v11.10.0
Минимальная зарегистрированная задержка цикла событий.
histogram.minBigInt
Добавлено в: v17.4.0, v16.14.0
Минимальная зарегистрированная задержка цикла событий.
histogram.percentile(percentile)
Добавлено в: v11.10.0
Возвращает значение в данном процентиле.
histogram.percentileBigInt(percentile)
Добавлено в: v17.4.0, v16.14.0
Возвращает значение в данном процентиле.
histogram.percentiles
Добавлено в: v11.10.0
Возвращает объект Map
, детализирующий накопленное распределение перцентилей.
histogram.percentilesBigInt
Добавлено в: v17.4.0, v16.14.0
Возвращает объект Map
, детализирующий накопленное распределение перцентилей.
histogram.reset()
Добавлено в: v11.10.0
Сбрасывает собранные данные гистограммы.
histogram.stddev
Добавлено в: v11.10.0
Стандартное отклонение записанных задержек цикла событий.
Class: IntervalHistogram extends Histogram
Histogram
, которая периодически обновляется через заданный интервал.
histogram.disable()
Добавлено в: v11.10.0
- Возвращает: <boolean>
Отключает таймер интервала обновления. Возвращает true
, если таймер был остановлен, false
, если он уже был остановлен.
histogram.enable()
Добавлено в: v11.10.0
- Возвращает: <boolean>
Включает таймер интервала обновления. Возвращает true
, если таймер был запущен, false
, если он уже был запущен.
Клонирование IntervalHistogram
Экземпляры <IntervalHistogram> могут быть клонированы через <MessagePort>. На принимающей стороне гистограмма клонируется как простой объект <Histogram>, который не реализует методы enable()
и disable()
.
Class: RecordableHistogram extends Histogram
Добавлено в: v15.9.0, v14.18.0
histogram.add(other)
Добавлено в: v17.4.0, v16.14.0
other
<RecordableHistogram>
Добавляет значения из other
в эту гистограмму.
histogram.record(val)
Добавлено в версии: v15.9.0, v14.18.0
histogram.recordDelta()
Добавлено в версии: v15.9.0, v14.18.0
Вычисляет количество времени (в наносекундах), прошедшее с момента предыдущего вызова recordDelta()
, и записывает это количество в гистограмму.
Примеры
Измерение длительности асинхронных операций
В следующем примере используются Async Hooks и Performance API для измерения фактической длительности операции Timeout (включая время, затраченное на выполнение обратного вызова).
import { createHook } from 'node:async_hooks';
import { performance, PerformanceObserver } from 'node:perf_hooks';
const set = new Set();
const hook = 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);
'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);
Измерение времени загрузки зависимостей
Следующий пример измеряет продолжительность операций require()
для загрузки зависимостей:
import { performance, PerformanceObserver } from 'node:perf_hooks';
// Активировать наблюдателя
const obs = new PerformanceObserver((list) => {
const entries = list.getEntries();
entries.forEach((entry) => {
console.log(`import('${entry[0]}')`, entry.duration);
});
performance.clearMarks();
performance.clearMeasures();
obs.disconnect();
});
obs.observe({ entryTypes: ['function'], buffered: true });
const timedImport = performance.timerify(async (module) => {
return await import(module);
});
await timedImport('some-module');
'use strict';
const {
performance,
PerformanceObserver,
} = require('node:perf_hooks');
const mod = require('node:module');
// Перехватываем функцию require
mod.Module.prototype.require =
performance.timerify(mod.Module.prototype.require);
require = performance.timerify(require);
// Активировать наблюдателя
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');
Измерение времени одного HTTP-цикла
Следующий пример используется для отслеживания времени, затраченного HTTP-клиентом (OutgoingMessage
) и HTTP-запросом (IncomingMessage
). Для HTTP-клиента это означает интервал времени между началом запроса и получением ответа, а для HTTP-запроса это означает интервал времени между получением запроса и отправкой ответа:
import { PerformanceObserver } from 'node:perf_hooks';
import { createServer, get } from 'node:http';
const obs = new PerformanceObserver((items) => {
items.getEntries().forEach((item) => {
console.log(item);
});
});
obs.observe({ entryTypes: ['http'] });
const PORT = 8080;
createServer((req, res) => {
res.end('ok');
}).listen(PORT, () => {
get(`http://127.0.0.1:${PORT}`);
});
'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}`);
});
Измерение времени, которое занимает net.connect
(только для TCP) при успешном подключении
import { PerformanceObserver } from 'node:perf_hooks';
import { connect, createServer } from 'node:net';
const obs = new PerformanceObserver((items) => {
items.getEntries().forEach((item) => {
console.log(item);
});
});
obs.observe({ entryTypes: ['net'] });
const PORT = 8080;
createServer((socket) => {
socket.destroy();
}).listen(PORT, () => {
connect(PORT);
});
'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);
});
Измерение времени, которое занимает DNS при успешном запросе
import { PerformanceObserver } from 'node:perf_hooks';
import { lookup, promises } from 'node:dns';
const obs = new PerformanceObserver((items) => {
items.getEntries().forEach((item) => {
console.log(item);
});
});
obs.observe({ entryTypes: ['dns'] });
lookup('localhost', () => {});
promises.resolve('localhost');
'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');