Skip to content

パフォーマンス測定 API

[安定版: 2 - 安定版]

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

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

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

Node.js は以下のWeb パフォーマンス APIをサポートしています。

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.0追加:v8.5.0

nameが指定されていない場合、パフォーマンスタイムラインからすべてのPerformanceMarkオブジェクトを削除します。nameが指定されている場合、指定された名前のマークのみを削除します。

performance.clearMeasures([name])

[履歴]

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

nameが指定されていない場合、パフォーマンスタイムラインからすべてのPerformanceMeasureオブジェクトを削除します。nameが指定されている場合、指定された名前の測定値のみを削除します。

performance.clearResourceTimings([name])

[履歴]

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

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

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

追加:v14.10.0, v12.19.0

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

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

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

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オブジェクトのリストをperformanceEntry.startTimeに関して時系列順に返します。

performance.getEntriesByType(type)

[履歴]

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

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

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()

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

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

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

[履歴]

バージョン変更
v22.2.0bodyInforesponseStatusdeliveryType引数を追加
v18.2.0, v16.17.0追加: v18.2.0, v16.17.0

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

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

作成されたPerformanceMarkエントリはグローバルリソースタイムラインに配置され、performance.getEntriesperformance.getEntriesByNameperformance.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> 測定結果に追加するオプションの詳細情報。
    • duration <number> 開始時間と終了時間の間の期間。
    • end <number> | <string> 終了時間として使用するタイムスタンプ、または以前に記録されたマークを識別する文字列。
    • start <number> | <string> 開始時間として使用するタイムスタンプ、または以前に記録されたマークを識別する文字列。
  • endMark <string> オプション。startMarkOrOptions <Object> の場合、省略する必要があります。

パフォーマンスタイムラインに新しいPerformanceMeasureエントリを作成します。PerformanceMeasurePerformanceEntryのサブクラスであり、performanceEntry.entryTypeは常に'measure'であり、performanceEntry.durationstartMarkendMarkの間経過したミリ秒数を測定します。

startMark引数は、パフォーマンスタイムライン内の既存のPerformanceMarkを識別するか、PerformanceNodeTimingクラスによって提供されるタイムスタンププロパティのいずれかを識別できます。名前付きのstartMarkが存在しない場合、エラーがスローされます。

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

作成されたPerformanceMeasureエントリはグローバルパフォーマンスタイムラインに配置され、performance.getEntriesperformance.getEntriesByNameperformance.getEntriesByTypeを使用して照会できます。観測が実行されると、エントリはperformance.clearMeasuresを使用してグローバルパフォーマンスタイムラインから手動でクリアする必要があります。

performance.nodeTiming

追加版: v8.5.0

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

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

performance.now()

[履歴]

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

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

performance.setResourceTimingBufferSize(maxSize)

[履歴]

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

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

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

performance.timeOrigin

追加版: v8.5.0

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

performance.timerify(fn[, options])

[履歴]

バージョン変更
v16.0.0ヒストグラムオプションを追加しました。
v16.0.0純粋な JavaScript を使用して再実装し、非同期関数の測定機能を追加しました。
v8.5.0追加版: 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

'resourcetimingbufferfull'イベントは、グローバルパフォーマンスリソースタイミングバッファがいっぱいになったときに発生します。イベントリスナーでperformance.setResourceTimingBufferSize()を使用してリソースタイミングバッファサイズを調整するか、performance.clearResourceTimings()を使用してバッファをクリアすることで、パフォーマンスタイムラインバッファにより多くのエントリを追加できるようにします。

クラス:PerformanceEntry

追加:v8.5.0

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

performanceEntry.duration

[履歴]

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

このエントリにかかった総ミリ秒数。この値は、すべての Performance Entry タイプで意味のあるものではありません。

performanceEntry.entryType

[履歴]

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

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

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

performanceEntry.name

[履歴]

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

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

performanceEntry.startTime

[履歴]

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

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

クラス: PerformanceMark

追加: v18.2.0, v16.17.0

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

[安定度: 0 - 非推奨]

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

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

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

performanceNodeEntry.kind

[履歴]

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

[安定度: 0 - 非推奨]

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

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

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

ガベージコレクション ('gc') の詳細

performanceEntry.type'gc' と等しい場合、performanceNodeEntry.detail プロパティは、次の 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プロパティは、追加のパフォーマンス情報を含むオブジェクトになります。

performanceEntry.nameHttp2Streamの場合、detailには以下のプロパティが含まれます。

  • bytesRead 数値 このHttp2Streamで受信したDATAフレームのバイト数。
  • bytesWritten 数値 このHttp2Streamで送信したDATAフレームのバイト数。
  • id 数値 関連付けられたHttp2Streamの識別子。
  • timeToFirstByte 数値 PerformanceEntrystartTimeと最初のDATAフレームの受信との間の経過時間(ミリ秒)。
  • timeToFirstByteSent 数値 PerformanceEntrystartTimeと最初のDATAフレームの送信との間の経過時間(ミリ秒)。
  • timeToFirstHeader 数値 PerformanceEntrystartTimeと最初のヘッダーの受信との間の経過時間(ミリ秒)。

performanceEntry.nameHttp2Sessionの場合、detailには以下のプロパティが含まれます。

  • bytesRead 数値 このHttp2Sessionで受信したバイト数。
  • bytesWritten 数値 このHttp2Sessionで送信したバイト数。
  • framesReceived 数値 Http2Sessionで受信した HTTP/2 フレームの数。
  • framesSent 数値 Http2Sessionで送信した HTTP/2 フレームの数。
  • maxConcurrentStreams 数値 Http2Sessionの存続期間中に同時に開かれたストリームの最大数。
  • pingRTT 数値 PINGフレームの送信と、その確認応答の受信との間の経過時間(ミリ秒)。PINGフレームがHttp2Sessionで送信された場合のみ存在します。
  • streamAverageDuration 数値 全てのHttp2Streamインスタンスの平均期間(ミリ秒)。
  • streamCount 数値 Http2Sessionによって処理されたHttp2Streamインスタンスの数。
  • type 文字列 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 の結果と同じです。

クラス: PerformanceNodeTiming

追加されたバージョン: v8.5.0

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

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

performanceNodeTiming.bootstrapComplete

追加されたバージョン: v8.5.0

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

performanceNodeTiming.environment

追加されたバージョン: v8.5.0

Node.js 環境が初期化されたときの、高解像度のミリ秒単位のタイムスタンプ。

performanceNodeTiming.idleTime

追加されたバージョン: v14.10.0, v12.19.0

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

performanceNodeTiming.loopExit

追加されたバージョン: v8.5.0

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

performanceNodeTiming.loopStart

追加されたバージョン: v8.5.0

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

performanceNodeTiming.nodeStart

追加されたバージョン: v8.5.0

Node.js プロセスが初期化されたときの、高解像度のミリ秒単位のタイムスタンプ。

performanceNodeTiming.uvMetricsInfo

追加されたバージョン: 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

追加:v8.5.0

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

クラス: PerformanceResourceTiming

追加:v18.2.0、v16.17.0

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

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

performanceResourceTiming.workerStart

[履歴]

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

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

performanceResourceTiming.redirectStart

[履歴]

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

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

performanceResourceTiming.redirectEnd

[履歴]

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

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

performanceResourceTiming.fetchStart

[履歴]

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

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

performanceResourceTiming.domainLookupStart

[履歴]

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

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

performanceResourceTiming.domainLookupEnd

[履歴]

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

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

performanceResourceTiming.connectStart

[履歴]

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

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

performanceResourceTiming.connectEnd

[履歴]

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

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

performanceResourceTiming.secureConnectionStart

[履歴]

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

Node.js が現在の接続を保護するためのハンドシェイクプロセスを開始する直前の時刻を表す、高解像度のミリ秒単位のタイムスタンプ。

performanceResourceTiming.requestStart

[履歴]

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

Node.js がサーバーから応答の最初のバイトを受信する直前の時刻を表す、高解像度のミリ秒単位のタイムスタンプ。

performanceResourceTiming.responseEnd

[履歴]

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

Node.js がリソースの最後のバイトを受信した直後、またはトランスポート接続が閉じられる直前のいずれか早い方の時刻を表す、高解像度のミリ秒単位のタイムスタンプ。

performanceResourceTiming.transferSize

[履歴]

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

取得したリソースのサイズ(オクテット単位)を表す数値。サイズには、レスポンスヘッダーフィールドとレスポンスペイロード本文が含まれます。

performanceResourceTiming.encodedBodySize

[履歴]

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

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

performanceResourceTiming.decodedBodySize

[履歴]

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

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

performanceResourceTiming.toJSON()

[履歴]

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

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インスタンスがパフォーマンスタイムラインに追加されたときに通知を提供します。

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>](/ja/api/perf_hooks#class-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])

追加: 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)

追加日時: 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])

追加日時: v15.9.0, v14.18.0

  • options <Object>

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

<RecordableHistogram>を返します。

perf_hooks.monitorEventLoopDelay([options])

追加日時: v11.10.0

  • options <Object>

    • resolution <number> サンプリングレート(ミリ秒)。0 より大きくする必要があります。デフォルト: 10
  • 戻り値: <IntervalHistogram>

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

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

タイマーを使用してイベントループの遅延を検出する方法が機能するのは、タイマーの実行が libuv イベントループのライフサイクルに特に関わっているためです。つまり、ループの遅延はタイマーの実行の遅延を引き起こし、これらの遅延は、この API が検出することを目的としたものです。

js
import { monitorEventLoopDelay } from 'node:perf_hooks'

const h = monitorEventLoopDelay({ resolution: 20 })
h.enable()
// 何らかの処理を実行します。
h.disable()
console.log(h.min)
console.log(h.max)
console.log(h.mean)
console.log(h.stddev)
console.log(h.percentiles)
console.log(h.percentile(50))
console.log(h.percentile(99))
js
const { monitorEventLoopDelay } = require('node:perf_hooks')
const h = monitorEventLoopDelay({ resolution: 20 })
h.enable()
// 何らかの処理を実行します。
h.disable()
console.log(h.min)
console.log(h.max)
console.log(h.mean)
console.log(h.stddev)
console.log(h.percentiles)
console.log(h.percentile(50))
console.log(h.percentile(99))

クラス: Histogram

追加日時: v11.10.0

histogram.count

追加日時: v17.4.0, v16.14.0

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

histogram.countBigInt

追加日時: v17.4.0, v16.14.0

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

histogram.exceeds

追加日時: v11.10.0

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

histogram.exceedsBigInt

追加日時: v17.4.0, v16.14.0

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

histogram.max

追加日時: v11.10.0

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

histogram.maxBigInt

追加日時: v17.4.0, v16.14.0

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

histogram.mean

追加日時: v11.10.0

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

histogram.min

追加日時: v11.10.0

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

histogram.minBigInt

追加日時: v17.4.0, v16.14.0

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

histogram.percentile(percentile)

追加日時: v11.10.0

  • 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オブジェクトを返します。

histogram.percentilesBigInt

追加日時: v17.4.0, v16.14.0

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

histogram.reset()

追加日時: v11.10.0

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

histogram.stddev

追加日時: v11.10.0

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

クラス: IntervalHistogram extends Histogram

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

histogram.disable()

追加日時: v11.10.0

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

histogram.enable()

追加日時: v11.10.0

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

IntervalHistogramの複製

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

クラス: RecordableHistogram extends Histogram

追加日時: v15.9.0, v14.18.0

histogram.add(other)

追加日時: 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()への前回の呼び出し以降に経過した時間(ナノ秒単位)を計算し、その量をヒストグラムに記録します。

非同期操作の期間の測定

次の例では、非同期フックとパフォーマンス API を使用して、タイムアウト操作の実際の期間(コールバックの実行にかかった時間も含む)を測定します。

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