API измерения производительности
[Стабильно: 2 - Стабильно]
Стабильно: 2 Стабильность: 2 - Стабильно
Исходный код: lib/perf_hooks.js
Этот модуль предоставляет реализацию подмножества API производительности 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
<строка>
Если name
не указан, удаляет все объекты PerformanceMark
из временной шкалы производительности. Если name
указан, удаляет только помеченный маркер.
performance.clearMeasures([name])
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v16.7.0 | Добавлено в: v16.7.0 |
name
<строка>
Если name
не указан, удаляет все объекты PerformanceMeasure
из временной шкалы производительности. Если name
указан, удаляет только указанное измерение.
performance.clearResourceTimings([name])
[История]
Версия | Изменения |
---|---|
v19.0.0 | Этот метод должен вызываться с объектом performance в качестве получателя. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
name
<строка>
Если name
не указан, удаляет все объекты PerformanceResourceTiming
из временной шкалы ресурсов. Если name
указан, удаляет только указанный ресурс.
performance.eventLoopUtilization([utilization1[, utilization2]])
Добавлено в: v14.10.0, v12.19.0
utilization1
<Объект> Результат предыдущего вызоваeventLoopUtilization()
.utilization2
<Объект> Результат предыдущего вызоваeventLoopUtilization()
доutilization1
.- Возвращает: <Объект>
Метод eventLoopUtilization()
возвращает объект, содержащий кумулятивную продолжительность времени, в течение которого цикл событий был как в режиме ожидания, так и в активном режиме, в виде высокоточного таймера в миллисекундах. Значение utilization
— это вычисленная загрузка цикла событий (ELU).
Если загрузка ещё не завершена в основном потоке, свойства имеют значение 0
. ELU немедленно доступна в потоках Worker, поскольку загрузка происходит внутри цикла событий.
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
в временной шкале производительности. PerformanceMark
— это подкласс PerformanceEntry
, у которого performanceEntry.entryType
всегда равен 'mark'
, а performanceEntry.duration
всегда равен 0
. Метки производительности используются для обозначения конкретных значимых моментов во временной шкале производительности.
Созданная запись PerformanceMark
помещается в глобальную временную шкалу производительности и может быть запрошена с помощью performance.getEntries
, performance.getEntriesByName
и performance.getEntriesByType
. После выполнения наблюдения записи должны быть вручную очищены из глобальной временной шкалы производительности с помощью performance.clearMarks
.
performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, global, cacheMode, bodyInfo, responseStatus[, deliveryType])
[История]
Версия | Изменения |
---|---|
v22.2.0 | Добавлены аргументы bodyInfo, responseStatus и deliveryType. |
v18.2.0, v16.17.0 | Добавлено в: v18.2.0, v16.17.0 |
timingInfo
<Объект> Информация о времени выборкиrequestedUrl
<строка> URL ресурсаinitiatorType
<строка> Имя инициатора, например: 'fetch'global
<Объект>cacheMode
<строка> Режим кэша должен быть пустой строкой ('') или 'local'bodyInfo
<Объект> Информация о теле ответа выборкиresponseStatus
<число> Код состояния ответаdeliveryType
<строка> Тип доставки. По умолчанию:''
.
Это свойство является расширением 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
<строка>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
Добавлен в: 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.
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'] })
// Будет создана запись временной шкалы производительности
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'] })
// Будет создана запись временной шкалы производительности
wrapped()
Если обернутая функция возвращает promise, к promise будет прикреплен обработчик 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'
(доступно в веб)'measure'
(доступно в веб)'net'
(только Node.js)'node'
(только Node.js)'resource'
(доступно в веб)
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 |
[Стабильность: 0 - Устарело]
Стабильность: 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 |
[Стабильность: 0 - Устарело]
Стабильность: 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')
Когда performanceEntry.type
равно 'function'
, свойство performanceNodeEntry.detail
будет <Array>, перечисляющим входные аргументы для замеряемой функции.
Подробности Net ('net')
Когда performanceEntry.type
равно 'net'
, свойство performanceNodeEntry.detail
будет <Object>, содержащим дополнительную информацию.
Если performanceEntry.name
равно connect
, detail
будет содержать следующие свойства: host
, port
.
Подробности DNS ('dns')
Когда 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
.
Класс: PerformanceNodeTiming
Добавлено в: v8.5.0
- Расширяет: <PerformanceEntry>
Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.
Предоставляет подробные данные о времени для самого Node.js. Конструктор этого класса не доступен пользователям.
performanceNodeTiming.bootstrapComplete
Добавлено в: v8.5.0
Метка времени в миллисекундах с высоким разрешением, в которой процесс Node.js завершил загрузку. Если загрузка еще не завершена, свойство имеет значение -1.
performanceNodeTiming.environment
Добавлен в: v8.5.0
Метка времени в миллисекундах с высоким разрешением, когда была инициализирована среда Node.js.
performanceNodeTiming.idleTime
Добавлен в: v14.10.0, v12.19.0
Метка времени в миллисекундах с высоким разрешением, показывающая время простоя цикла событий в поставщике событий цикла событий (например, epoll_wait
). При этом не учитывается использование ЦП. Если цикл событий ещё не запущен (например, на первом такте основного скрипта), свойство имеет значение 0.
performanceNodeTiming.loopExit
Добавлен в: v8.5.0
Метка времени в миллисекундах с высоким разрешением, когда цикл событий Node.js завершился. Если цикл событий ещё не завершился, свойство имеет значение -1. Значение, отличное от -1, может быть только в обработчике события 'exit'
.
performanceNodeTiming.loopStart
Добавлен в: v8.5.0
Метка времени в миллисекундах с высоким разрешением, когда был запущен цикл событий Node.js. Если цикл событий ещё не запущен (например, на первом такте основного скрипта), свойство имеет значение -1.
performanceNodeTiming.nodeStart
Добавлен в: v8.5.0
Метка времени в миллисекундах с высоким разрешением, когда был запущен процесс Node.js.
performanceNodeTiming.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 |
Высокоточный временной штамп в миллисекундах, представляющий время начала получения, которое инициирует перенаправление.
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
в временную шкалу производительности.
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
<Объект>type
<строка> Один тип <PerformanceEntry>. Не должен задаваться, еслиentryTypes
уже указан.entryTypes
<массив строк> Массив строк, определяющих типы экземпляров <PerformanceEntry>, которые интересуют наблюдателя. Если не предоставлен, будет выброшено исключение.buffered
<булево> Если 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))
Class: 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
Среднеквадратичное отклонение зарегистрированных задержек цикла событий.
Класс: IntervalHistogram extends Histogram
Histogram
, который периодически обновляется через заданный интервал.
histogram.disable()
Добавлено в: v11.10.0
- Возвращает: <boolean>
Отключает таймер интервала обновления. Возвращает true
, если таймер был остановлен, false
, если он уже был остановлен.
histogram.enable()
Добавлено в: v11.10.0
- Возвращает: <boolean>
Включает таймер интервала обновления. Возвращает true
, если таймер был запущен, false
, если он уже был запущен.
Клонирование IntervalHistogram
Экземпляры <IntervalHistogram> могут быть клонированы через <MessagePort>. На принимающей стороне гистограмма клонируется как простой объект <Histogram>, который не реализует методы enable()
и disable()
.
Класс: RecordableHistogram extends Histogram
Добавлено в: v15.9.0, v14.18.0
histogram.add(other)
Добавлено в: v17.4.0, v16.14.0
other
<RecordableHistogram>
Добавляет значения из other
в эту гистограмму.
histogram.record(val)
Добавлено в: v15.9.0, v14.18.0
histogram.recordDelta()
Добавлено в: v15.9.0, v14.18.0
Вычисляет количество прошедшего времени (в наносекундах) с момента предыдущего вызова recordDelta()
и записывает это количество в гистограмму.
Примеры
Измерение продолжительности асинхронных операций
В следующем примере используются Асинхронные хуки и API производительности для измерения фактической продолжительности операции таймаута (включая время, затраченное на выполнение обратного вызова).
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')
// Monkey patch функции 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')