Skip to content

パフォーマンス測定 API

[安定版: 2 - 安定]

安定版: 2 安定度: 2 - 安定

ソースコード: lib/perf_hooks.js

このモジュールは、W3C Web Performance APIs のサブセットと、Node.js 固有のパフォーマンス測定のための追加 API の実装を提供します。

Node.js は、以下の Web Performance APIs をサポートしています。

js
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');
});
js
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.0Added in: v8.5.0

name が指定されていない場合、Performance Timeline からすべての PerformanceMark オブジェクトを削除します。 name が指定されている場合は、指定された名前のマークのみを削除します。

performance.clearMeasures([name])

[履歴]

バージョン変更点
v19.0.0このメソッドは、レシーバーとして performance オブジェクトを指定して呼び出す必要があります。
v16.7.0Added in: v16.7.0

name が指定されていない場合、Performance Timeline からすべての PerformanceMeasure オブジェクトを削除します。 name が指定されている場合は、指定された名前のメジャーのみを削除します。

performance.clearResourceTimings([name])

[履歴]

バージョン変更点
v19.0.0このメソッドは、レシーバーとして performance オブジェクトを指定して呼び出す必要があります。
v18.2.0, v16.17.0Added in: v18.2.0, v16.17.0

name が指定されていない場合、Resource Timeline からすべての PerformanceResourceTiming オブジェクトを削除します。 name が指定されている場合は、指定された名前のリソースのみを削除します。

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

Added in: v14.10.0, v12.19.0

  • utilization1 <Object> eventLoopUtilization() の以前の呼び出しの結果。
  • utilization2 <Object> utilization1 より前の eventLoopUtilization() の以前の呼び出しの結果。
  • 戻り値: <Object>

eventLoopUtilization() メソッドは、イベントループがアイドル状態であった累積時間とアクティブ状態であった累積時間を、高分解能のミリ秒タイマーとして含むオブジェクトを返します。 utilization の値は、計算された Event Loop Utilization (ELU) です。

メインスレッドでブートストラップがまだ完了していない場合、プロパティの値は 0 になります。 ELU は、Worker threads では、ブートストラップがイベントループ内で発生するため、すぐに利用可能です。

utilization1utilization2 はどちらもオプションのパラメータです。

utilization1 が渡された場合、現在の呼び出しの active 時間と idle 時間の差、および対応する utilization 値が計算されて返されます(process.hrtime() と同様)。

utilization1utilization2 の両方が渡された場合、2 つの引数間の差が計算されます。 これは、process.hrtime() とは異なり、ELU の計算が単一の減算よりも複雑であるため、便利なオプションです。

ELU は CPU 使用率に似ていますが、CPU 使用率ではなくイベントループの統計のみを測定します。 これは、イベントループがイベントループのイベントプロバイダー(例: epoll_wait)の外で費やした時間の割合を表します。 他の CPU アイドル時間は考慮されません。 以下は、ほとんどアイドル状態のプロセスが高い ELU を持つ例です。

js
import { eventLoopUtilization } from 'node:perf_hooks';
import { spawnSync } from 'node:child_process';

setImmediate(() => {
  const elu = eventLoopUtilization();
  spawnSync('sleep', ['5']);
  console.log(eventLoopUtilization(elu).utilization);
});
js
'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);
});

このスクリプトの実行中、CPU はほとんどアイドル状態ですが、utilization の値は 1 です。 これは、child_process.spawnSync() の呼び出しがイベントループの進行をブロックするためです。

eventLoopUtilization() の以前の呼び出しの結果ではなく、ユーザー定義のオブジェクトを渡すと、未定義の動作につながります。 戻り値は、イベントループの正しい状態を反映することを保証されていません。

performance.getEntries()

[履歴]

バージョン変更
v19.0.0このメソッドは、レシーバーとして performance オブジェクトとともに呼び出す必要があります。
v16.7.0追加: v16.7.0

performanceEntry.startTime に関して時系列順に並んだ PerformanceEntry オブジェクトのリストを返します。 特定のタイプまたは特定の名前のパフォーマンスエントリのみに関心がある場合は、performance.getEntriesByType() および performance.getEntriesByName() を参照してください。

performance.getEntriesByName(name[, type])

[履歴]

バージョン変更
v19.0.0このメソッドは、レシーバーとして performance オブジェクトとともに呼び出す必要があります。
v16.7.0追加: v16.7.0

performanceEntry.namename と等しく、オプションで performanceEntry.entryTypetype と等しい、performanceEntry.startTime に関して時系列順に並んだ PerformanceEntry オブジェクトのリストを返します。

performance.getEntriesByType(type)

[履歴]

バージョン変更
v19.0.0このメソッドは、レシーバーとして performance オブジェクトとともに呼び出す必要があります。
v16.7.0追加: v16.7.0

performanceEntry.entryTypetype と等しい、performanceEntry.startTime に関して時系列順に並んだ PerformanceEntry オブジェクトのリストを返します。

performance.mark(name[, options])

[履歴]

バージョン変更
v19.0.0このメソッドは、レシーバーとして performance オブジェクトとともに呼び出す必要があります。 name 引数はオプションではなくなりました。
v16.0.0User Timing Level 3 仕様に準拠するように更新されました。
v8.5.0追加: v8.5.0
  • name <string>
  • options <Object>
    • detail <any> マークに含める追加のオプションの詳細。
    • startTime <number> マーク時間として使用されるオプションのタイムスタンプ。 デフォルト: performance.now()

Performance Timeline に新しい PerformanceMark エントリを作成します。 PerformanceMarkPerformanceEntry のサブクラスであり、performanceEntry.entryType は常に 'mark' であり、performanceEntry.duration は常に 0 です。 パフォーマンスマークは、Performance Timeline 内の特定の重要な瞬間をマークするために使用されます。

作成された PerformanceMark エントリはグローバル Performance Timeline に配置され、performance.getEntriesperformance.getEntriesByName、および performance.getEntriesByType でクエリできます。 観測を実行する場合、エントリは performance.clearMarks を使用してグローバル Performance Timeline から手動でクリアする必要があります。

performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, global, cacheMode, bodyInfo, responseStatus[, deliveryType])

[履歴]

バージョン変更点
v22.2.0bodyInfo、responseStatus、deliveryType 引数が追加されました。
v18.2.0, v16.17.0以下で追加: v18.2.0, v16.17.0

このプロパティは Node.js による拡張です。Web ブラウザでは利用できません。

リソースタイムラインに新しい PerformanceResourceTiming エントリを作成します。PerformanceResourceTimingPerformanceEntry のサブクラスであり、その performanceEntry.entryType は常に 'resource' です。パフォーマンスリソースは、リソースタイムラインの瞬間をマークするために使用されます。

作成された PerformanceMark エントリはグローバルリソースタイムラインに配置され、performance.getEntriesperformance.getEntriesByName、および performance.getEntriesByType でクエリできます。観測を実行する場合、エントリは performance.clearResourceTimings を使用してグローバルパフォーマンスタイムラインから手動でクリアする必要があります。

performance.measure(name[, startMarkOrOptions[, endMark]])

[履歴]

バージョン変更点
v19.0.0このメソッドはレシーバーとして performance オブジェクトとともに呼び出されなければなりません。
v16.0.0User Timing Level 3 仕様に準拠するように更新されました。
v13.13.0, v12.16.3startMarkendMark パラメータを省略可能にしました。
v8.5.0追加: v8.5.0
  • name <string>

  • startMarkOrOptions <string> | <Object> オプション。

    • detail <any> measure に含める追加のオプションの詳細。
    • duration <number> 開始時間と終了時間の間の期間。
    • end <number> | <string> 終了時間として使用されるタイムスタンプ、または以前に記録された mark を識別する文字列。
    • start <number> | <string> 開始時間として使用されるタイムスタンプ、または以前に記録された mark を識別する文字列。
  • endMark <string> オプション。 startMarkOrOptions<Object> の場合は省略する必要があります。

Performance Timeline に新しい PerformanceMeasure エントリを作成します。 PerformanceMeasureperformanceEntry.entryType が常に 'measure' である PerformanceEntry のサブクラスであり、performanceEntry.durationstartMarkendMark から経過したミリ秒数を測定します。

startMark 引数は、Performance Timeline に存在する PerformanceMark、または PerformanceNodeTiming クラスによって提供されるタイムスタンププロパティのいずれかを識別できます。 指定された startMark が存在しない場合は、エラーがスローされます。

オプションの endMark 引数は、Performance Timeline に存在する PerformanceMark、または PerformanceNodeTiming クラスによって提供されるタイムスタンププロパティのいずれかを識別する必要があります。 パラメータが渡されない場合、endMarkperformance.now() になり、それ以外の場合、指定された endMark が存在しない場合は、エラーがスローされます。

作成された PerformanceMeasure エントリはグローバル Performance Timeline に配置され、performance.getEntriesperformance.getEntriesByName、および performance.getEntriesByType でクエリできます。 観測が実行されると、エントリは performance.clearMeasures を使用してグローバル Performance Timeline から手動でクリアする必要があります。

performance.nodeTiming

Added in: v8.5.0

このプロパティはNode.jsによる拡張です。Webブラウザーでは利用できません。

Node.jsの特定の操作上のマイルストーンのパフォーマンスメトリクスを提供するPerformanceNodeTimingクラスのインスタンス。

performance.now()

[履歴]

バージョン変更
v19.0.0このメソッドは、レシーバーとしてperformanceオブジェクトとともに呼び出す必要があります。
v8.5.0Added in: v8.5.0

現在の高解像度ミリ秒タイムスタンプを返します。ここで、0は現在のnodeプロセスの開始を表します。

performance.setResourceTimingBufferSize(maxSize)

[履歴]

バージョン変更
v19.0.0このメソッドは、レシーバーとしてperformanceオブジェクトとともに呼び出す必要があります。
v18.8.0Added in: v18.8.0

グローバルなパフォーマンスリソースタイミングバッファーサイズを指定された数の「resource」タイプのパフォーマンスエントリオブジェクトに設定します。

デフォルトでは、最大バッファーサイズは250に設定されています。

performance.timeOrigin

Added in: v8.5.0

timeOriginは、現在のnodeプロセスがUnix時間で測定された開始時の高解像度ミリ秒タイムスタンプを指定します。

performance.timerify(fn[, options])

[履歴]

バージョン変更
v16.0.0ヒストグラムオプションが追加されました。
v16.0.0純粋なJavaScriptと非同期関数を計測する機能を使用するように再実装されました。
v8.5.0Added in: v8.5.0
  • fn <Function>
  • options <Object>
    • histogram <RecordableHistogram> ナノ秒単位で実行時間を記録するperf_hooks.createHistogram()を使用して作成されたヒストグラムオブジェクト。

このプロパティはNode.jsによる拡張です。Webブラウザーでは利用できません。

ラップされた関数の実行時間を測定する新しい関数内で関数をラップします。タイミングの詳細にアクセスするには、PerformanceObserver'function'イベントタイプにサブスクライブする必要があります。

js
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();
js
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を返す場合、finallyハンドラーがpromiseにアタッチされ、finallyハンドラーが呼び出されると継続時間が報告されます。

performance.toJSON()

[履歴]

バージョン変更
v19.0.0このメソッドは、レシーバーとして performance オブジェクトを指定して呼び出す必要があります。
v16.1.0追加: v16.1.0

performance オブジェクトの JSON 表現であるオブジェクト。ブラウザーの window.performance.toJSON と同様です。

イベント: 'resourcetimingbufferfull'

追加: v18.8.0

グローバルな performance resource timing バッファーがいっぱいになると、'resourcetimingbufferfull' イベントが発生します。performance timeline バッファーにさらにエントリを追加できるようにするには、イベントリスナーで performance.setResourceTimingBufferSize() でリソースタイミングバッファーのサイズを調整するか、performance.clearResourceTimings() でバッファーをクリアします。

クラス: PerformanceEntry

追加: v8.5.0

このクラスのコンストラクターは、ユーザーに直接公開されていません。

performanceEntry.duration

[履歴]

バージョン変更
v19.0.0このプロパティゲッターは、レシーバーとして PerformanceEntry オブジェクトを指定して呼び出す必要があります。
v8.5.0追加: v8.5.0

このエントリに経過した合計ミリ秒数。この値は、すべてのパフォーマンスエントリタイプで意味があるとは限りません。

performanceEntry.entryType

[履歴]

バージョン変更
v19.0.0このプロパティゲッターは、レシーバーとして PerformanceEntry オブジェクトを指定して呼び出す必要があります。
v8.5.0追加: v8.5.0

パフォーマンスエントリのタイプ。次のいずれかになります。

  • 'dns' (Node.js のみ)
  • 'function' (Node.js のみ)
  • 'gc' (Node.js のみ)
  • 'http2' (Node.js のみ)
  • 'http' (Node.js のみ)
  • 'mark' (Web で利用可能)
  • 'measure' (Web で利用可能)
  • 'net' (Node.js のみ)
  • 'node' (Node.js のみ)
  • 'resource' (Web で利用可能)

performanceEntry.name

[履歴]

バージョン変更点
v19.0.0このプロパティゲッターは、レシーバーとして PerformanceEntry オブジェクトを指定して呼び出す必要があります。
v8.5.0追加: v8.5.0

パフォーマンスエントリーの名前。

performanceEntry.startTime

[履歴]

バージョン変更点
v19.0.0このプロパティゲッターは、レシーバーとして PerformanceEntry オブジェクトを指定して呼び出す必要があります。
v8.5.0追加: v8.5.0

パフォーマンスエントリーの開始時刻を示す高分解能のミリ秒タイムスタンプ。

クラス: PerformanceMark

追加: v18.2.0, v16.17.0

Performance.mark() メソッドを使用して作成されたマークを公開します。

performanceMark.detail

[履歴]

バージョン変更点
v19.0.0このプロパティゲッターは、レシーバーとして PerformanceMark オブジェクトを指定して呼び出す必要があります。
v16.0.0追加: v16.0.0

Performance.mark() メソッドで作成するときに指定された追加の詳細。

クラス: PerformanceMeasure

追加: v18.2.0, v16.17.0

Performance.measure() メソッドを使用して作成されたメジャーを公開します。

このクラスのコンストラクターは、ユーザーに直接公開されていません。

performanceMeasure.detail

[履歴]

バージョン変更点
v19.0.0このプロパティゲッターは、レシーバーとして PerformanceMeasure オブジェクトを指定して呼び出す必要があります。
v16.0.0追加: v16.0.0

Performance.measure() メソッドで作成するときに指定された追加の詳細。

クラス: PerformanceNodeEntry

追加: v19.0.0

このクラスは Node.js による拡張です。Web ブラウザーでは利用できません。

詳細な Node.js タイミングデータを提供します。

このクラスのコンストラクターは、ユーザーに直接公開されていません。

performanceNodeEntry.detail

[履歴]

バージョン変更
v19.0.0このプロパティゲッターは、レシーバーとして PerformanceNodeEntry オブジェクトとともに呼び出す必要があります。
v16.0.0追加: v16.0.0

entryType に固有の追加の詳細。

performanceNodeEntry.flags

[履歴]

バージョン変更
v16.0.0ランタイムで非推奨になりました。entryType が 'gc' の場合、detail プロパティに移動されました。
v13.9.0, v12.17.0追加: v13.9.0, v12.17.0

[Stable: 0 - 非推奨]

Stable: 0 安定度: 0 - 非推奨: 代わりに performanceNodeEntry.detail を使用してください。

performanceEntry.entryType'gc' に等しい場合、performance.flags プロパティにはガベージコレクション操作に関する追加情報が含まれます。値は次のいずれかになります。

  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NO
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCED
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY
  • perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE

performanceNodeEntry.kind

[履歴]

バージョン変更
v16.0.0ランタイムで非推奨になりました。entryType が 'gc' の場合、detail プロパティに移動されました。
v8.5.0追加: v8.5.0

[Stable: 0 - 非推奨]

Stable: 0 安定度: 0 - 非推奨: 代わりに performanceNodeEntry.detail を使用してください。

performanceEntry.entryType'gc' に等しい場合、performance.kind プロパティは発生したガベージコレクション操作の種類を識別します。値は次のいずれかになります。

  • perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR
  • perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR
  • perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL
  • perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB

Garbage Collection ('gc') の詳細

performanceEntry.type'gc' に等しい場合、performanceNodeEntry.detail プロパティは、以下の2つのプロパティを持つ<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.nameHttpClient に等しい場合、detail には次のプロパティが含まれます: req, res。そして、req プロパティは、method, url, headers を含む<Object>になり、res プロパティは、statusCode, statusMessage, headers を含む<Object>になります。

performanceEntry.nameHttpRequest に等しい場合、detail には次のプロパティが含まれます: req, res。そして、req プロパティは、method, url, headers を含む<Object>になり、res プロパティは、statusCode, statusMessage, headers を含む<Object>になります。

これは追加のメモリオーバーヘッドを加える可能性があり、診断目的でのみ使用されるべきで、デフォルトで本番環境でオンのままにすべきではありません。

HTTP/2 ('http2') の詳細

performanceEntry.type'http2' と等しい場合、performanceNodeEntry.detail プロパティは、追加のパフォーマンス情報を含む<Object>になります。

performanceEntry.nameHttp2Stream と等しい場合、detail には次のプロパティが含まれます。

  • bytesRead <number> この Http2Stream に対して受信した DATA フレームのバイト数。
  • bytesWritten <number> この Http2Stream に対して送信した DATA フレームのバイト数。
  • id <number> 関連する Http2Stream の識別子。
  • timeToFirstByte <number> PerformanceEntrystartTime から最初の DATA フレームを受信するまでの経過時間(ミリ秒単位)。
  • timeToFirstByteSent <number> PerformanceEntrystartTime から最初の DATA フレームを送信するまでの経過時間(ミリ秒単位)。
  • timeToFirstHeader <number> PerformanceEntrystartTime から最初のヘッダーを受信するまでの経過時間(ミリ秒単位)。

performanceEntry.nameHttp2Session と等しい場合、detail には次のプロパティが含まれます。

  • bytesRead <number> この Http2Session に対して受信したバイト数。
  • bytesWritten <number> この Http2Session に対して送信したバイト数。
  • framesReceived <number> Http2Session が受信した HTTP/2 フレームの数。
  • framesSent <number> Http2Session が送信した HTTP/2 フレームの数。
  • maxConcurrentStreams <number> Http2Session の存続期間中に同時にオープンされたストリームの最大数。
  • pingRTT <number> PING フレームの送信からその確認応答の受信までの経過時間(ミリ秒単位)。 PING フレームが Http2Session で送信された場合にのみ存在します。
  • streamAverageDuration <number> すべての Http2Stream インスタンスの平均継続時間(ミリ秒単位)。
  • streamCount <number> Http2Session によって処理された Http2Stream インスタンスの数。
  • type <string> Http2Session の種類を識別するための 'server' または 'client'

Timerify ('function') の詳細

performanceEntry.type'function' と等しい場合、performanceNodeEntry.detail プロパティは、時間計測された関数への入力引数をリストした <Array> になります。

Net ('net') の詳細

performanceEntry.type'net' と等しい場合、performanceNodeEntry.detail プロパティは、追加情報を含む <Object> になります。

performanceEntry.nameconnect と等しい場合、detail は次のプロパティを含みます: host, port

DNS ('dns') の詳細

performanceEntry.type'dns' と等しい場合、performanceNodeEntry.detail プロパティは、追加情報を含む <Object> になります。

performanceEntry.namelookup と等しい場合、detail は次のプロパティを含みます: hostname, family, hints, verbatim, addresses

performanceEntry.namelookupService と等しい場合、detail は次のプロパティを含みます: host, port, hostname, service

performanceEntry.namequeryxxx または getHostByAddr と等しい場合、detail は次のプロパティを含みます: host, ttl, resultresult の値は、queryxxx または getHostByAddr の結果と同じです。

Class: PerformanceNodeTiming

Added in: v8.5.0

このプロパティは Node.js による拡張です。Web ブラウザーでは利用できません。

Node.js 自体のタイミングに関する詳細を提供します。このクラスのコンストラクターはユーザーに公開されていません。

performanceNodeTiming.bootstrapComplete

Added in: v8.5.0

Node.js プロセスがブートストラップを完了した高解像度ミリ秒タイムスタンプ。ブートストラップがまだ完了していない場合、プロパティの値は -1 です。

performanceNodeTiming.environment

Added in: v8.5.0

Node.js環境が初期化された時点での高解像度ミリ秒タイムスタンプ。

performanceNodeTiming.idleTime

Added in: v14.10.0, v12.19.0

イベントループのイベントプロバイダー(例:epoll_wait)内で、イベントループがアイドル状態だった時間の高解像度ミリ秒タイムスタンプ。 これはCPU使用率を考慮していません。 イベントループがまだ開始されていない場合(例:メインスクリプトの最初のティック)、プロパティの値は0です。

performanceNodeTiming.loopExit

Added in: v8.5.0

Node.jsのイベントループが終了した時点での高解像度ミリ秒タイムスタンプ。 イベントループがまだ終了していない場合、プロパティの値は-1です。 これは、'exit'イベントのハンドラーでのみ、-1以外の値を持ちます。

performanceNodeTiming.loopStart

Added in: v8.5.0

Node.jsのイベントループが開始された時点での高解像度ミリ秒タイムスタンプ。 イベントループがまだ開始されていない場合(例:メインスクリプトの最初のティック)、プロパティの値は-1です。

performanceNodeTiming.nodeStart

Added in: v8.5.0

Node.jsプロセスが初期化された時点での高解像度ミリ秒タイムスタンプ。

performanceNodeTiming.uvMetricsInfo

Added in: v22.8.0, v20.18.0

  • 戻り値: <Object>
    • loopCount <number> イベントループのイテレーション数。
    • events <number> イベントハンドラーによって処理されたイベントの数。
    • eventsWaiting <number> イベントプロバイダーが呼び出されたときに、処理されるのを待っていたイベントの数。

これは uv_metrics_info 関数へのラッパーです。 イベントループの現在のメトリクスセットを返します。

現在のループイテレーション中にスケジュールされたすべての操作が終了する前にメトリクスを収集しないように、setImmediate を使用して実行がスケジュールされた関数内でこのプロパティを使用することをお勧めします。

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

setImmediate(() => {
  console.log(performance.nodeTiming.uvMetricsInfo);
});
js
import { performance } from 'node:perf_hooks';

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

performanceNodeTiming.v8Start

Added in: v8.5.0

V8プラットフォームが初期化された高解像度ミリ秒のタイムスタンプ。

Class: PerformanceResourceTiming

Added in: v18.2.0, v16.17.0

アプリケーションのリソースのロードに関する詳細なネットワークタイミングデータを提供します。

このクラスのコンストラクターは、ユーザーに直接公開されていません。

performanceResourceTiming.workerStart

[History]

VersionChanges
v19.0.0このプロパティゲッターは、PerformanceResourceTimingオブジェクトをレシーバーとして呼び出す必要があります。
v18.2.0, v16.17.0Added in: v18.2.0, v16.17.0

fetchリクエストのディスパッチ直前の高解像度ミリ秒のタイムスタンプ。 リソースがワーカーによってインターセプトされない場合、このプロパティは常に0を返します。

performanceResourceTiming.redirectStart

[History]

VersionChanges
v19.0.0このプロパティゲッターは、PerformanceResourceTimingオブジェクトをレシーバーとして呼び出す必要があります。
v18.2.0, v16.17.0Added in: v18.2.0, v16.17.0

リダイレクトを開始するfetchの開始時刻を表す高解像度ミリ秒のタイムスタンプ。

performanceResourceTiming.redirectEnd

[History]

VersionChanges
v19.0.0このプロパティゲッターは、PerformanceResourceTimingオブジェクトをレシーバーとして呼び出す必要があります。
v18.2.0, v16.17.0Added in: v18.2.0, v16.17.0

最後のリダイレクトのレスポンスの最後のバイトを受信した直後に作成される高解像度ミリ秒のタイムスタンプ。

performanceResourceTiming.fetchStart

[History]

VersionChanges
v19.0.0このプロパティのゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。
v18.2.0, v16.17.0Added in: v18.2.0, v16.17.0

Node.js がリソースのフェッチを開始する直前の高解像度ミリ秒タイムスタンプ。

performanceResourceTiming.domainLookupStart

[History]

VersionChanges
v19.0.0このプロパティのゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。
v18.2.0, v16.17.0Added in: v18.2.0, v16.17.0

Node.js がリソースのドメイン名ルックアップを開始する直前の高解像度ミリ秒タイムスタンプ。

performanceResourceTiming.domainLookupEnd

[History]

VersionChanges
v19.0.0このプロパティのゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。
v18.2.0, v16.17.0Added in: v18.2.0, v16.17.0

Node.js がリソースのドメイン名ルックアップを完了した直後の時間を表す高解像度ミリ秒タイムスタンプ。

performanceResourceTiming.connectStart

[History]

VersionChanges
v19.0.0このプロパティのゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。
v18.2.0, v16.17.0Added in: v18.2.0, v16.17.0

Node.js がリソースを取得するためにサーバーへの接続を確立し始める直前の時間を表す高解像度ミリ秒タイムスタンプ。

performanceResourceTiming.connectEnd

[履歴]

バージョン変更点
v19.0.0このプロパティのゲッターは、レシーバーとして PerformanceResourceTiming オブジェクトを指定して呼び出す必要があります。
v18.2.0, v16.17.0v18.2.0, v16.17.0 で追加

Node.js がリソースを取得するためにサーバーへの接続を確立した後、すぐに経過した時間を示す高解像度のミリ秒タイムスタンプ。

performanceResourceTiming.secureConnectionStart

[履歴]

バージョン変更点
v19.0.0このプロパティのゲッターは、レシーバーとして PerformanceResourceTiming オブジェクトを指定して呼び出す必要があります。
v18.2.0, v16.17.0v18.2.0, v16.17.0 で追加

Node.js が現在の接続をセキュリティで保護するためのハンドシェイクプロセスを開始する直前に経過した時間を示す高解像度のミリ秒タイムスタンプ。

performanceResourceTiming.requestStart

[履歴]

バージョン変更点
v19.0.0このプロパティのゲッターは、レシーバーとして PerformanceResourceTiming オブジェクトを指定して呼び出す必要があります。
v18.2.0, v16.17.0v18.2.0, v16.17.0 で追加

Node.js がサーバーから応答の最初のバイトを受信する直前に経過した時間を示す高解像度のミリ秒タイムスタンプ。

performanceResourceTiming.responseEnd

[履歴]

バージョン変更点
v19.0.0このプロパティのゲッターは、レシーバーとして PerformanceResourceTiming オブジェクトを指定して呼び出す必要があります。
v18.2.0, v16.17.0v18.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

適用されたcontent-codingを削除する前に、フェッチ(HTTPまたはキャッシュ)から受信したペイロードボディのサイズ(オクテット単位)を表す数値。

performanceResourceTiming.decodedBodySize

[履歴]

バージョン変更
v19.0.0このプロパティゲッターは、レシーバーとして PerformanceResourceTiming オブジェクトを使用して呼び出す必要があります。
v18.2.0, v16.17.0追加: v18.2.0, v16.17.0

適用されたcontent-codingを削除した後に、フェッチ(HTTPまたはキャッシュ)から受信したメッセージボディのサイズ(オクテット単位)を表す数値。

performanceResourceTiming.toJSON()

[履歴]

バージョン変更
v19.0.0このメソッドは、レシーバーとして PerformanceResourceTiming オブジェクトを使用して呼び出す必要があります。
v18.2.0, v16.17.0追加: v18.2.0, v16.17.0

PerformanceResourceTimingオブジェクトのJSON表現であるobjectを返します。

クラス: PerformanceObserver

追加: v8.5.0

PerformanceObserver.supportedEntryTypes

追加: v16.0.0

サポートされている型を取得します。

new PerformanceObserver(callback)

[履歴]

バージョン変更点
v18.0.0callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。
v8.5.0追加: v8.5.0

PerformanceObserver オブジェクトは、新しい PerformanceEntry インスタンスが Performance Timeline に追加されたときに通知を提供します。

js
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');
js
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.0Performance Timeline Level 2 に準拠するように更新されました。 buffered オプションが再び追加されました。
v16.0.0User 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>インスタンスを、options.entryTypes または options.type のいずれかで識別される新しい<PerformanceEntry>インスタンスの通知にサブスクライブします。

js
import { performance, PerformanceObserver } from 'node:perf_hooks';

const obs = new PerformanceObserver((list, observer) => {
  // 非同期で一度呼び出されます。 `list` には 3 つのアイテムが含まれています。
});
obs.observe({ type: 'mark' });

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

const obs = new PerformanceObserver((list, observer) => {
  // 非同期で一度呼び出されます。 `list` には 3 つのアイテムが含まれています。
});
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 クラスは、PerformanceObserver に渡された PerformanceEntry インスタンスへのアクセスを提供するために使用されます。このクラスのコンストラクターは、ユーザーには公開されていません。

performanceObserverEntryList.getEntries()

追加: v8.5.0

performanceEntry.startTime を基準にして、PerformanceEntry オブジェクトのリストを時系列順に返します。

js
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');
js
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])

Added in: v8.5.0

performanceEntry.namename と等しく、オプションで、performanceEntry.entryTypetype と等しい PerformanceEntry オブジェクトのリストを、performanceEntry.startTime に関して時系列順で返します。

js
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');
js
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)

Added in: v8.5.0

performanceEntry.entryTypetype と等しい PerformanceEntry オブジェクトのリストを、performanceEntry.startTime を基準にして時系列順に返します。

js
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');
js
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])

Added in: v15.9.0, v14.18.0

  • options <Object>

    • lowest <number> | <bigint> 識別可能な最小値。0 より大きい整数値でなければなりません。 Default: 1.
    • highest <number> | <bigint> 記録可能な最大値。lowest の 2 倍以上の整数値でなければなりません。 Default: Number.MAX_SAFE_INTEGER.
    • figures <number> 精度桁数。1 から 5 の間の数値でなければなりません。 Default: 3.
  • 戻り値: <RecordableHistogram>

<RecordableHistogram> を返します。

perf_hooks.monitorEventLoopDelay([options])

Added in: v11.10.0

  • options <Object>

    • resolution <number> サンプリングレート(ミリ秒単位)。ゼロより大きくなければなりません。デフォルト: 10
  • 戻り値: <IntervalHistogram>

このプロパティはNode.jsによる拡張です。Webブラウザーでは利用できません。

時間経過に伴うイベントループの遅延をサンプリングして報告するIntervalHistogramオブジェクトを作成します。遅延はナノ秒単位で報告されます。

タイマーを使用してイベントループのおおよその遅延を検出するのは、タイマーの実行がlibuvイベントループのライフサイクルに具体的に結びついているためです。つまり、ループの遅延はタイマーの実行の遅延を引き起こし、それらの遅延は具体的にこのAPIが検出することを意図しているものです。

js
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));
js
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));

Class: Histogram

Added in: v11.10.0

histogram.count

Added in: v17.4.0, v16.14.0

ヒストグラムによって記録されたサンプル数。

histogram.countBigInt

Added in: v17.4.0, v16.14.0

ヒストグラムによって記録されたサンプル数。

histogram.exceeds

Added in: v11.10.0

イベントループの遅延が最大1時間のイベントループ遅延の閾値を超えた回数。

histogram.exceedsBigInt

Added in: v17.4.0, v16.14.0

イベントループの遅延が最大1時間のイベントループ遅延の閾値を超えた回数。

histogram.max

Added in: v11.10.0

記録されたイベントループ遅延の最大値。

histogram.maxBigInt

Added in: v17.4.0, v16.14.0

記録されたイベントループ遅延の最大値。

histogram.mean

Added in: v11.10.0

記録されたイベントループ遅延の平均値。

histogram.min

Added in: v11.10.0

記録されたイベントループ遅延の最小値。

histogram.minBigInt

Added in: v17.4.0, v16.14.0

記録されたイベントループ遅延の最小値。

histogram.percentile(percentile)

Added in: v11.10.0

  • percentile <number> 範囲 (0, 100] のパーセンタイル値。
  • 戻り値: <number>

指定されたパーセンタイルの値を返します。

histogram.percentileBigInt(percentile)

Added in: v17.4.0, v16.14.0

  • percentile <number> 範囲 (0, 100] のパーセンタイル値。
  • 戻り値: <bigint>

指定されたパーセンタイルの値を返します。

histogram.percentiles

Added in: v11.10.0

累積されたパーセンタイル分布の詳細を示す Map オブジェクトを返します。

histogram.percentilesBigInt

Added in: v17.4.0, v16.14.0

累積されたパーセンタイル分布の詳細を示す Map オブジェクトを返します。

histogram.reset()

Added in: v11.10.0

収集されたヒストグラムデータをリセットします。

histogram.stddev

Added in: v11.10.0

記録されたイベントループ遅延の標準偏差。

Class: IntervalHistogram extends Histogram

指定された間隔で定期的に更新される Histogram

histogram.disable()

Added in: v11.10.0

更新間隔タイマーを無効にします。タイマーが停止した場合は true、すでに停止していた場合は false を返します。

histogram.enable()

Added in: v11.10.0

更新間隔タイマーを有効にします。タイマーが開始された場合は true、すでに開始されていた場合は false を返します。

IntervalHistogram のクローン

<IntervalHistogram> インスタンスは <MessagePort> を介して複製できます。受信側では、ヒストグラムは enable() および disable() メソッドを実装していないプレーンな <Histogram> オブジェクトとして複製されます。

Class: RecordableHistogram extends Histogram

Added in: v15.9.0, v14.18.0

histogram.add(other)

Added in: v17.4.0, v16.14.0

other の値をこのヒストグラムに追加します。

histogram.record(val)

追加: v15.9.0, v14.18.0

histogram.recordDelta()

追加: v15.9.0, v14.18.0

recordDelta() の前回の呼び出しから経過した時間(ナノ秒単位)を計算し、その量をヒストグラムに記録します。

非同期操作の期間の測定

次の例では、Async Hooks および Performance API を使用して、Timeout 操作の実際の期間 (コールバックの実行にかかった時間を含む) を測定します。

js
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);
js
'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() 操作の時間を測定します。

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

// require 関数にモンキーパッチを当てる
mod.Module.prototype.require =
  performance.timerify(mod.Module.prototype.require);
require = performance.timerify(require);

// オブザーバーを有効化
const obs = new PerformanceObserver((list) => {
  const entries = list.getEntries();
  entries.forEach((entry) => {
    console.log(`require('${entry[0]}')`, entry.duration);
  });
  performance.clearMarks();
  performance.clearMeasures();
  obs.disconnect();
});
obs.observe({ entryTypes: ['function'], buffered: true });

require('some-module');

1 回の HTTP ラウンドトリップにかかる時間の計測

以下の例は、HTTP クライアント (OutgoingMessage) および HTTP リクエスト (IncomingMessage) で費やされた時間を追跡するために使用されます。HTTP クライアントの場合、これはリクエストの開始からレスポンスの受信までの時間間隔を意味し、HTTP リクエストの場合、これはリクエストの受信からレスポンスの送信までの時間間隔を意味します。

js
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}`);
});
js
'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 のみ) が成功した場合の所要時間の測定

js
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);
});
js
'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 の所要時間の測定

js
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');
js
'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');