Spec-Zone.ru › Node.js 24 LTS

API измерения производительности

Стабильность: 2 — Стабильный

Исходный код: lib/perf_hooks.js

Этот модуль предоставляет реализацию подмножества API производительности веб-платформы W3C, а также дополнительные API для измерения производительности, специфичные для Node.js.

Node.js поддерживает следующие API производительности веб-платформы:

  • Время с высоким разрешением
  • Шкала времени производительности
  • Пользовательское время
  • Время загрузки ресурсов
Модули JavaScript
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');
});
CommonJS
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 из шкалы времени производительности. Если name указан, удаляет только метку с этим именем.

performance.clearMeasures([name])

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, передавая объект performance в качестве получателя.

v16.7.0

Добавлено в: v16.7.0

  • name <string>

Если name не указан, удаляет все объекты PerformanceMeasure из шкалы времени производительности. Если name указан, удаляет только измерение с этим именем.

performance.clearResourceTimings([name])

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, передавая объект performance в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • name <string>

Если name не указан, удаляет все объекты PerformanceResourceTiming из шкалы времени ресурсов. Если name указан, удаляет только ресурс с этим именем.

performance.eventLoopUtilization([utilization1[, utilization2]])

История
Версия Изменения
v24.12.0

Добавлен псевдоним perf_hooks.eventLoopUtilization.

v14.10.0, v12.19.0

Добавлено в: v14.10.0, v12.19.0

  • utilization1 <Object> Результат предыдущего вызова eventLoopUtilization().
  • utilization2 <Object> Результат предыдущего вызова eventLoopUtilization() до utilization1.
  • Возвращает: <Object>
    • idle <number>
    • active <number>
    • utilization <number>

Это псевдоним perf_hooks.eventLoopUtilization().

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

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

  • name <string>
  • options <Object>
    • detail <any> Дополнительные необязательные данные, которые нужно включить в метку.
    • startTime <number> Необязательная временная метка, используемая в качестве времени метки. По умолчанию: performance.now().

Создает новую запись 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 <Object> Информация о времени Fetch
  • requestedUrl <string> URL-адрес ресурса
  • initiatorType <string> Имя инициатора, например: 'fetch'
  • global <Object>
  • cacheMode <string> Режим кэша должен быть пустой строкой ('') или 'local'
  • bodyInfo <Object> Информация о теле ответа Fetch
  • responseStatus <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 в шкале времени производительности. 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
  • Тип: <PerformanceNodeTiming>

Это свойство является расширением 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

Устанавливает размер глобального буфера времени загрузки ресурсов в указанное количество объектов записей производительности типа "resource".

По умолчанию максимальный размер буфера равен 250.

performance.timeOrigin

Добавлено в: v8.5.0
  • Тип: <number>

timeOrigin задает временную метку с высоким разрешением в миллисекундах, соответствующую моменту начала текущего процесса node, измеренную по времени Unix.

performance.timerify(fn[, options])

История
Версия Изменения
v24.12.0

Добавлен псевдоним perf_hooks.timerify.

v16.0.0

Добавлен параметр histogram.

v16.0.0

Реализован заново с использованием чистого JavaScript и возможностью измерять время выполнения асинхронных функций.

v8.5.0

Добавлено в: v8.5.0

  • fn <Function>
  • options <Object>
    • histogram <RecordableHistogram> Объект гистограммы, созданный с помощью perf_hooks.createHistogram(), который записывает длительность выполнения в наносекундах.

Это псевдоним perf_hooks.timerify().

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

performance.toJSON()

История
Версия Изменения
v19.0.0

Этот метод необходимо вызывать, передавая объект performance в качестве получателя.

v16.1.0

Добавлено в: v16.1.0

Объект, представляющий объект performance в формате JSON. Он похож на 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

  • Тип: <number>

Общее количество миллисекунд, прошедших для этой записи. Это значение не имеет смысла для некоторых типов записей производительности.

performanceEntry.entryType

История
Версия Изменения
v19.0.0

Этот геттер свойства необходимо вызывать, передавая объект PerformanceEntry в качестве получателя.

v8.5.0

Добавлено в: v8.5.0

  • Тип: <string>

Тип записи производительности. Это может быть одно из следующих значений:

  • '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

  • Тип: <string>

Имя записи производительности.

performanceEntry.startTime

История
Версия Изменения
v19.0.0

Этот геттер свойства необходимо вызывать, передавая объект PerformanceEntry в качестве получателя.

v8.5.0

Добавлено в: v8.5.0

  • Тип: <number>

Временная метка с высоким разрешением в миллисекундах, обозначающая время начала записи производительности.

Класс: PerformanceMark

Добавлено в: v18.2.0, v16.17.0
  • Расширяет: <PerformanceEntry>

Предоставляет доступ к меткам, созданным с помощью метода Performance.mark().

performanceMark.detail

История
Версия Изменения
v19.0.0

Этот геттер свойства необходимо вызывать, передавая объект PerformanceMark в качестве получателя.

v16.0.0

Добавлено в: v16.0.0

  • Тип: <any>

Дополнительные данные, указанные при создании с помощью метода Performance.mark().

Класс: PerformanceMeasure

Добавлено в: v18.2.0, v16.17.0
  • Расширяет: <PerformanceEntry>

Предоставляет доступ к измерениям, созданным с помощью метода Performance.measure().

Конструктор этого класса не предоставляется пользователям напрямую.

performanceMeasure.detail

История
Версия Изменения
v19.0.0

Этот геттер свойства необходимо вызывать, передавая объект PerformanceMeasure в качестве получателя.

v16.0.0

Добавлено в: v16.0.0

  • Тип: <any>

Дополнительные данные, указанные при создании с помощью метода Performance.measure().

Класс: PerformanceNodeEntry

Добавлено в: v19.0.0
  • Наследует: <PerformanceEntry>

Этот класс является расширением Node.js. Он недоступен в веб-браузерах.

Предоставляет подробные данные о времени выполнения Node.js.

Конструктор этого класса не предоставляется пользователям напрямую.

performanceNodeEntry.detail

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceNodeEntry в качестве получателя.

v16.0.0

Добавлено в: v16.0.0

  • Тип: <any>

Дополнительные сведения, относящиеся к entryType.

performanceNodeEntry.flags

История
Версия Изменения
v16.0.0

Устарело во время выполнения. Теперь перемещено в свойство detail, если entryType равно 'gc'.

v13.9.0, v12.17.0

Добавлено в: v13.9.0, v12.17.0

Стабильность: 0 — Устарело: вместо этого используйте performanceNodeEntry.detail.
  • Тип: <number>

Если 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 — Устарело: вместо этого используйте performanceNodeEntry.detail.
  • Тип: <number>

Если 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> Количество миллисекунд, прошедших между PerformanceEntry startTime и получением первого кадра DATA.
  • timeToFirstByteSent <number> Количество миллисекунд, прошедших между PerformanceEntry startTime и отправкой первого кадра DATA.
  • timeToFirstHeader <number> Количество миллисекунд, прошедших между PerformanceEntry startTime и получением первого заголовка.

Если 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> Для определения типа Http2Session используется либо 'server', либо 'client'.

Сведения о 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
  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, соответствующая моменту завершения начальной загрузки процесса Node.js. Если начальная загрузка еще не завершена, значение свойства равно -1.

performanceNodeTiming.environment

Добавлено в: v8.5.0
  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, соответствующая моменту инициализации среды Node.js.

performanceNodeTiming.idleTime

Добавлено в: v14.10.0, v12.19.0
  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, соответствующая времени простоя цикла событий внутри поставщика событий цикла событий (например, epoll_wait). При этом загрузка ЦП не учитывается. Если цикл событий еще не запущен (например, на первом такте основного скрипта), значение свойства равно 0.

performanceNodeTiming.loopExit

Добавлено в: v8.5.0
  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, соответствующая моменту выхода цикла событий Node.js. Если цикл событий еще не завершился, значение свойства равно -1. Значение, отличное от -1, может быть установлено только в обработчике события 'exit'.

performanceNodeTiming.loopStart

Добавлено в: v8.5.0
  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, соответствующая моменту запуска цикла событий Node.js. Если цикл событий еще не запущен (например, на первом такте основного скрипта), значение свойства равно -1.

performanceNodeTiming.nodeStart

Добавлено в: v8.5.0
  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, соответствующая моменту инициализации процесса Node.js.

performanceNodeTiming.uvMetricsInfo

Добавлено в: v22.8.0, v20.18.0
  • Возвращает: <Object>
    • loopCount <number> Количество итераций цикла событий.
    • events <number> Количество событий, обработанных обработчиком событий.
    • eventsWaiting <number> Количество событий, ожидавших обработки на момент вызова поставщика событий.

Это оболочка для функции uv_metrics_info. Она возвращает текущий набор метрик цикла событий.

Рекомендуется использовать это свойство внутри функции, выполнение которой было запланировано с помощью setImmediate, чтобы избежать сбора метрик до завершения всех операций, запланированных во время текущей итерации цикла.

CommonJS
const { performance } = require('node:perf_hooks');

setImmediate(() => {
  console.log(performance.nodeTiming.uvMetricsInfo);
});
Модули JavaScript
import { performance } from 'node:perf_hooks';

setImmediate(() => {
  console.log(performance.nodeTiming.uvMetricsInfo);
});

performanceNodeTiming.v8Start

Добавлено в: v8.5.0
  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, соответствующая моменту инициализации платформы 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

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах непосредственно перед отправкой запроса fetch. Если ресурс не перехватывается рабочим процессом, свойство всегда возвращает 0.

performanceResourceTiming.redirectStart

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, обозначающая время начала выборки, инициирующей перенаправление.

performanceResourceTiming.redirectEnd

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, которая будет создана сразу после получения последнего байта ответа последнего перенаправления.

performanceResourceTiming.fetchStart

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах непосредственно перед тем, как Node.js начинает загружать ресурс.

performanceResourceTiming.domainLookupStart

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах непосредственно перед тем, как Node.js начинает поиск доменного имени ресурса.

performanceResourceTiming.domainLookupEnd

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, обозначающая момент сразу после завершения Node.js поиска доменного имени ресурса.

performanceResourceTiming.connectStart

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, обозначающая момент непосредственно перед тем, как Node.js начинает устанавливать соединение с сервером для получения ресурса.

performanceResourceTiming.connectEnd

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, обозначающая момент сразу после завершения Node.js установки соединения с сервером для получения ресурса.

performanceResourceTiming.secureConnectionStart

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, обозначающая момент непосредственно перед тем, как Node.js начинает процесс согласования параметров безопасности текущего соединения.

performanceResourceTiming.requestStart

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, обозначающая момент непосредственно перед получением Node.js первого байта ответа от сервера.

performanceResourceTiming.responseEnd

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Отметка времени с высоким разрешением в миллисекундах, обозначающая момент сразу после получения Node.js последнего байта ресурса или непосредственно перед закрытием транспортного соединения — в зависимости от того, что произойдет раньше.

performanceResourceTiming.transferSize

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Число, представляющее размер загруженного ресурса (в октетах). Размер включает поля заголовка ответа и тело полезной нагрузки ответа.

performanceResourceTiming.encodedBodySize

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Число, представляющее размер тела полезной нагрузки (в октетах), полученного при загрузке (по HTTP или из кэша), до удаления примененных кодировок содержимого.

performanceResourceTiming.decodedBodySize

История
Версия Изменения
v19.0.0

Геттер этого свойства необходимо вызывать, передав объект PerformanceResourceTiming в качестве получателя.

v18.2.0, v16.17.0

Добавлено в: v18.2.0, v16.17.0

  • Тип: <number>

Число, представляющее размер тела сообщения (в октетах), полученного при загрузке (по 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
  • Тип: <string[]>

Возвращает поддерживаемые типы.

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 в шкалу производительности.

Модули JavaScript
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');
CommonJS
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:

Модули JavaScript
import { performance, PerformanceObserver } from 'node:perf_hooks';

const obs = new PerformanceObserver((list, observer) => {
  // Called once asynchronously. `list` contains three items.
});
obs.observe({ type: 'mark' });

for (let n = 0; n < 3; n++)
  performance.mark(`test${n}`);
CommonJS
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

const obs = new PerformanceObserver((list, observer) => {
  // Called once asynchronously. `list` contains three items.
});
obs.observe({ type: 'mark' });

for (let n = 0; n < 3; n++)
  performance.mark(`test${n}`);

performanceObserver.takeRecords()

Добавлено в: v16.0.0
  • Возвращает: <PerformanceEntry[]> Текущий список записей, хранящихся в наблюдателе производительности; список очищается.

Класс: PerformanceObserverEntryList

Добавлено в: v8.5.0

Класс PerformanceObserverEntryList используется для доступа к экземплярам PerformanceEntry, переданным в PerformanceObserver. Конструктор этого класса недоступен пользователям.

performanceObserverEntryList.getEntries()

Добавлено в: v8.5.0
  • Возвращает: <PerformanceEntry[]>

Возвращает список объектов PerformanceEntry в хронологическом порядке относительно performanceEntry.startTime.

Модули JavaScript
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');
CommonJS
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.

Модули JavaScript
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');
CommonJS
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.

Модули JavaScript
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');
CommonJS
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.eventLoopUtilization([utilization1[, utilization2]])

Добавлено в: v24.12.0
  • utilization1 <Object> Результат предыдущего вызова eventLoopUtilization().
  • utilization2 <Object> Результат предыдущего вызова eventLoopUtilization() до utilization1.
  • Возвращает: <Object>
    • idle <number>
    • active <number>
    • utilization <number>

Функция eventLoopUtilization() возвращает объект, содержащий суммарную продолжительность простоя и активности цикла обработки событий, измеренную таймером с высокой точностью в миллисекундах. Значение utilization представляет собой вычисленную утилизацию цикла обработки событий (ELU).

Если инициализация основного потока ещё не завершена, значения свойств равны 0. Значение ELU сразу доступно в потоках Worker, поскольку инициализация происходит внутри цикла обработки событий.

Параметры utilization1 и utilization2 необязательны.

Если передан utilization1, вычисляются и возвращаются разница между значениями active и idle текущего вызова, а также соответствующее значение utilization (аналогично process.hrtime()).

Если переданы оба параметра — utilization1 и utilization2, — разница вычисляется между этими двумя аргументами. Это удобный вариант, поскольку, в отличие от process.hrtime(), вычисление ELU сложнее, чем простое вычитание.

ELU аналогична утилизации ЦП, за исключением того, что учитывает только статистику цикла обработки событий, а не использование ЦП. Она показывает, какой процент времени цикл обработки событий проводит вне своего поставщика событий (например, epoll_wait). Прочее время простоя ЦП не учитывается. Ниже приведён пример процесса с высокой ELU, несмотря на то что он в основном простаивает.

Модули JavaScript
import { eventLoopUtilization } from 'node:perf_hooks';
import { spawnSync } from 'node:child_process';

setImmediate(() => {
  const elu = eventLoopUtilization();
  spawnSync('sleep', ['5']);
  console.log(eventLoopUtilization(elu).utilization);
});
CommonJS
'use strict';
const { eventLoopUtilization } = require('node:perf_hooks');
const { spawnSync } = require('node:child_process');

setImmediate(() => {
  const elu = eventLoopUtilization();
  spawnSync('sleep', ['5']);
  console.log(eventLoopUtilization(elu).utilization);
});

Хотя во время выполнения этого скрипта ЦП в основном простаивает, значение utilization равно 1. Это происходит потому, что вызов child_process.spawnSync() блокирует дальнейшую работу цикла обработки событий.

Передача пользовательского объекта вместо результата предыдущего вызова eventLoopUtilization() приводит к неопределённому поведению. Возвращаемые значения не гарантируют корректное отражение состояния цикла обработки событий.

perf_hooks.monitorEventLoopDelay([options])

Добавлено в: v11.10.0
  • options <Object>
    • resolution <number> Интервал выборки в миллисекундах. Должен быть больше нуля. По умолчанию: 10.
  • Возвращает: <IntervalHistogram>

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

Создаёт объект IntervalHistogram, который измеряет и сообщает о задержке цикла обработки событий с течением времени. Задержки сообщаются в наносекундах.

Таймер подходит для приблизительного определения задержки цикла обработки событий, поскольку выполнение таймеров напрямую связано с жизненным циклом цикла обработки событий libuv. То есть задержка цикла приводит к задержке выполнения таймера; именно эти задержки и предназначен обнаруживать данный API.

Модули JavaScript
import { monitorEventLoopDelay } from 'node:perf_hooks';

const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
// Do something.
h.disable();
console.log(h.min);
console.log(h.max);
console.log(h.mean);
console.log(h.stddev);
console.log(h.percentiles);
console.log(h.percentile(50));
console.log(h.percentile(99));
CommonJS
const { monitorEventLoopDelay } = require('node:perf_hooks');
const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
// Do something.
h.disable();
console.log(h.min);
console.log(h.max);
console.log(h.mean);
console.log(h.stddev);
console.log(h.percentiles);
console.log(h.percentile(50));
console.log(h.percentile(99));

perf_hooks.timerify(fn[, options])

Добавлено в: v24.12.0
  • fn <Function>
  • options <Object>
    • histogram <RecordableHistogram> Объект гистограммы, созданный с помощью perf_hooks.createHistogram(), который записывает длительность выполнения в наносекундах.

Это свойство является расширением Node.js. Оно недоступно в веб-браузерах.

Оборачивает функцию в новую функцию, измеряющую время выполнения исходной функции. Чтобы получить сведения о времени выполнения, необходимо подписать PerformanceObserver на тип события 'function'.

Модули JavaScript
import { timerify, performance, PerformanceObserver } from 'node:perf_hooks';

function someFunction() {
  console.log('hello world');
}

const wrapped = 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();
CommonJS
const {
  timerify,
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');

function someFunction() {
  console.log('hello world');
}

const wrapped = 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, а длительность будет сообщена после вызова этого обработчика.

Класс: Histogram

Добавлено в: v11.10.0

histogram.count

Добавлено в: v17.4.0, v16.14.0
  • Тип: <number>

Количество выборок, записанных гистограммой.

histogram.countBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <bigint>

Количество выборок, записанных гистограммой.

histogram.exceeds

Добавлено в: v11.10.0
  • Тип: <number>

Количество превышений задержкой цикла обработки событий порога максимальной задержки, равного одному часу.

histogram.exceedsBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <bigint>

Количество превышений задержкой цикла обработки событий порога максимальной задержки, равного одному часу.

histogram.max

Добавлено в: v11.10.0
  • Тип: <number>

Максимальная зарегистрированная задержка цикла обработки событий.

histogram.maxBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <bigint>

Максимальная зарегистрированная задержка цикла обработки событий.

histogram.mean

Добавлено в: v11.10.0
  • Тип: <number>

Среднее значение зарегистрированных задержек цикла обработки событий.

histogram.min

Добавлено в: v11.10.0
  • Тип: <number>

Минимальная зарегистрированная задержка цикла обработки событий.

histogram.minBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <bigint>

Минимальная зарегистрированная задержка цикла обработки событий.

histogram.percentile(percentile)

Добавлено в: v11.10.0
  • percentile <number> Значение процентиля в диапазоне (0, 100].
  • Возвращает: <number>

Возвращает значение для указанного процентиля.

histogram.percentileBigInt(percentile)

Добавлено в: v17.4.0, v16.14.0
  • percentile <number> Значение процентиля в диапазоне (0, 100].
  • Возвращает: <bigint>

Возвращает значение для указанного процентиля.

histogram.percentiles

Добавлено в: v11.10.0
  • Тип: <Map>

Возвращает объект Map с данными о накопленном распределении процентилей.

histogram.percentilesBigInt

Добавлено в: v17.4.0, v16.14.0
  • Тип: <Map>

Возвращает объект Map с данными о накопленном распределении процентилей.

histogram.reset()

Добавлено в: v11.10.0

Сбрасывает собранные данные гистограммы.

histogram.stddev

Добавлено в: v11.10.0
  • Тип: <number>

Стандартное отклонение зарегистрированных задержек цикла обработки событий.

Класс: IntervalHistogram extends Histogram

Объект Histogram, периодически обновляемый с заданным интервалом.

histogram.disable()

Добавлено в: v11.10.0
  • Возвращает: <boolean>

Отключает таймер интервала обновления. Возвращает true, если таймер был остановлен, и false, если он уже был остановлен.

histogram.enable()

Добавлено в: v11.10.0
  • Возвращает: <boolean>

Включает таймер интервала обновления. Возвращает true, если таймер был запущен, и false, если он уже был запущен.

histogram[Symbol.dispose]()

Добавлено в: v24.2.0

Отключает таймер интервала обновления при удалении гистограммы.

const { monitorEventLoopDelay } = require('node:perf_hooks');
{
  using hist = monitorEventLoopDelay({ resolution: 20 });
  hist.enable();
  // The histogram will be disabled when the block is exited.
} copy

Клонирование 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
  • val <number> | <bigint> Значение, записываемое в гистограмму.

histogram.recordDelta()

Добавлено в: v15.9.0, v14.18.0

Вычисляет время (в наносекундах), прошедшее с предыдущего вызова recordDelta(), и записывает это значение в гистограмму.

Примеры

Измерение длительности асинхронных операций

В следующем примере используются API Async Hooks и Performance для измерения фактической длительности операции Timeout (включая время выполнения обратного вызова).

Модули JavaScript
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);
CommonJS
'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'] });

setTimeout(() => {}, 1000);

Измерение времени загрузки зависимостей

В следующем примере измеряется длительность операций require() по загрузке зависимостей:

Модули JavaScript
import { performance, PerformanceObserver } from 'node:perf_hooks';

// Activate the observer
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');
CommonJS
'use strict';
const {
  performance,
  PerformanceObserver,
} = require('node:perf_hooks');
const mod = require('node:module');

// Monkey patch the require function
mod.Module.prototype.require =
  performance.timerify(mod.Module.prototype.require);
require = performance.timerify(require);

// Activate the observer
const obs = new PerformanceObserver((list) => {
  const entries = list.getEntries();
  entries.forEach((entry) => {
    console.log(`require('${entry[0]}')`, entry.duration);
  });
  performance.clearMarks();
  performance.clearMeasures();
  obs.disconnect();
});
obs.observe({ entryTypes: ['function'] });

require('some-module');

Измерение времени полного HTTP-обмена

В следующем примере отслеживается время, затраченное HTTP-клиентом (OutgoingMessage) и HTTP-запросом (IncomingMessage). Для HTTP-клиента это интервал между отправкой запроса и получением ответа, а для HTTP-запроса — интервал между получением запроса и отправкой ответа:

Модули JavaScript
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}`);
});
CommonJS
'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) при успешном подключении

Модули JavaScript
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);
});
CommonJS
'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 при успешном запросе

Модули JavaScript
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');
CommonJS
'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');

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v24.x/docs/api/perf_hooks.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API