パフォーマンス測定 API
ソースコード: lib/perf_hooks.js
このモジュールは、W3C のWeb パフォーマンス API のサブセットと、Node.js 固有のパフォーマンス測定のための追加 API を実装しています。
Node.js は以下のWeb パフォーマンス APIをサポートしています。
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver(items => {
console.log(items.getEntries()[0].duration)
performance.clearMarks()
})
obs.observe({ type: 'measure' })
performance.measure('Start to Now')
performance.mark('A')
doSomeLongRunningProcess(() => {
performance.measure('A to Now', 'A')
performance.mark('B')
performance.measure('A to B', 'A', 'B')
})
const { PerformanceObserver, performance } = require('node:perf_hooks')
const obs = new PerformanceObserver(items => {
console.log(items.getEntries()[0].duration)
})
obs.observe({ type: 'measure' })
performance.measure('Start to Now')
performance.mark('A')
;(async function doSomeLongRunningProcess() {
await new Promise(r => setTimeout(r, 5000))
performance.measure('A to Now', 'A')
performance.mark('B')
performance.measure('A to B', 'A', 'B')
})()
perf_hooks.performance
追加されたバージョン: v8.5.0
現在の Node.js インスタンスからパフォーマンスメトリクスを収集するために使用できるオブジェクトです。ブラウザのwindow.performance
に似ています。
performance.clearMarks([name])
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、performance オブジェクトをレシーバーとして呼び出す必要があります。 |
v8.5.0 | 追加:v8.5.0 |
name
<string>
name
が指定されていない場合、パフォーマンスタイムラインからすべてのPerformanceMark
オブジェクトを削除します。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]])
追加:v14.10.0, v12.19.0
utilization1
<Object>eventLoopUtilization()
への以前の呼び出しの結果。utilization2
<Object>utilization1
より前のeventLoopUtilization()
への以前の呼び出しの結果。- 戻り値: <Object>
eventLoopUtilization()
メソッドは、イベントループがアイドル状態とアクティブ状態であった累積時間を、高解像度のミリ秒タイマーとして含むオブジェクトを返します。utilization
値は、計算されたイベントループ使用率(ELU)です。
メインスレッドでブートストラップがまだ完了していない場合、プロパティの値は0
になります。ELU は、ブートストラップがイベントループ内で発生するため、ワーカー スレッドではすぐに利用できます。
utilization1
とutilization2
はどちらもオプションのパラメーターです。
utilization1
が渡された場合、現在の呼び出しのactive
時間とidle
時間、および対応するutilization
値間のデルタが計算され、返されます(process.hrtime()
に似ています)。
utilization1
とutilization2
の両方が渡された場合、2 つの引数の間でデルタが計算されます。これは便利なオプションです。なぜなら、process.hrtime()
とは異なり、ELU の計算は単一の減算よりも複雑だからです。
ELU は CPU 使用率に似ていますが、CPU 使用率ではなく、イベントループの統計のみを測定します。これは、イベントループがイベントループのイベントプロバイダー(例:epoll_wait
)の外で費やした時間の割合を表します。他の CPU アイドル時間は考慮されません。ほとんどアイドル状態のプロセスでは ELU が高くなる例を以下に示します。
import { eventLoopUtilization } from 'node:perf_hooks'
import { spawnSync } from 'node:child_process'
setImmediate(() => {
const elu = eventLoopUtilization()
spawnSync('sleep', ['5'])
console.log(eventLoopUtilization(elu).utilization)
})
'use strict'
const { eventLoopUtilization } = require('node:perf_hooks').performance
const { spawnSync } = require('node:child_process')
setImmediate(() => {
const elu = eventLoopUtilization()
spawnSync('sleep', ['5'])
console.log(eventLoopUtilization(elu).utilization)
})
このスクリプトを実行している間、CPU はほとんどアイドル状態ですが、utilization
の値は1
です。これは、child_process.spawnSync()
への呼び出しが、イベントループの続行をブロックするためです。
eventLoopUtilization()
への以前の呼び出しの結果ではなく、ユーザー定義のオブジェクトを渡すと、動作が未定義になります。戻り値は、イベントループの正しい状態を反映しているとは限りません。
performance.getEntries()
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバとしてperformance オブジェクトを使用して呼び出す必要があります。 |
v16.7.0 | 追加:v16.7.0 |
- 戻り値: <PerformanceEntry[]>
performanceEntry.startTime
に関して時系列順に並べられたPerformanceEntry
オブジェクトのリストを返します。特定の種類のパフォーマンスエントリまたは特定の名前を持つパフォーマンスエントリのみに関心がある場合は、performance.getEntriesByType()
およびperformance.getEntriesByName()
を参照してください。
performance.getEntriesByName(name[, type])
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバとしてperformance オブジェクトを使用して呼び出す必要があります。 |
v16.7.0 | 追加:v16.7.0 |
name
<string>type
<string>- 戻り値: <PerformanceEntry[]>
performanceEntry.name
がname
と等しく、オプションでperformanceEntry.entryType
がtype
と等しいPerformanceEntry
オブジェクトのリストをperformanceEntry.startTime
に関して時系列順に返します。
performance.getEntriesByType(type)
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバとしてperformance オブジェクトを使用して呼び出す必要があります。 |
v16.7.0 | 追加:v16.7.0 |
type
<string>- 戻り値: <PerformanceEntry[]>
performanceEntry.entryType
がtype
と等しいPerformanceEntry
オブジェクトのリストをperformanceEntry.startTime
に関して時系列順に返します。
performance.mark(name[, options])
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバとしてperformance オブジェクトを使用して呼び出す必要があります。name 引数は必須になりました。 |
v16.0.0 | User Timing Level 3 仕様に準拠するように更新されました。 |
v8.5.0 | 追加:v8.5.0 |
パフォーマンスタイムラインに新しいPerformanceMark
エントリを作成します。PerformanceMark
はPerformanceEntry
のサブクラスであり、そのperformanceEntry.entryType
は常に'mark'
であり、performanceEntry.duration
は常に0
です。パフォーマンスマークは、パフォーマンスタイムラインにおける特定の重要な瞬間をマークするために使用されます。
作成されたPerformanceMark
エントリはグローバルパフォーマンスタイムラインに配置され、performance.getEntries
、performance.getEntriesByName
、performance.getEntriesByType
を使用してクエリできます。観測が行われたら、performance.clearMarks
を使用してグローバルパフォーマンスタイムラインからエントリを手動でクリアする必要があります。
performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, global, cacheMode, bodyInfo, responseStatus[, deliveryType])
[履歴]
バージョン | 変更 |
---|---|
v22.2.0 | bodyInfo 、responseStatus 、deliveryType 引数を追加 |
v18.2.0, v16.17.0 | 追加: v18.2.0, v16.17.0 |
timingInfo
<Object> Fetch Timing InforequestedUrl
<string> リソース URLinitiatorType
<string> イニシエータ名、例: 'fetch'global
<Object>cacheMode
<string> キャッシュモードは空文字列('')または'local'でなければなりませんbodyInfo
<Object> Fetch Response Body InforesponseStatus
<number> レスポンスのステータスコードdeliveryType
<string> 配信タイプ。デフォルト:''
。
このプロパティは Node.js による拡張です。Web ブラウザでは使用できません。
リソースタイムラインに新しい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 |
パフォーマンスタイムラインに新しいPerformanceMeasure
エントリを作成します。PerformanceMeasure
はPerformanceEntry
のサブクラスであり、performanceEntry.entryType
は常に'measure'
であり、performanceEntry.duration
はstartMark
とendMark
の間経過したミリ秒数を測定します。
startMark
引数は、パフォーマンスタイムライン内の既存のPerformanceMark
を識別するか、PerformanceNodeTiming
クラスによって提供されるタイムスタンププロパティのいずれかを識別できます。名前付きのstartMark
が存在しない場合、エラーがスローされます。
オプションのendMark
引数は、パフォーマンスタイムライン内の既存のPerformanceMark
またはPerformanceNodeTiming
クラスによって提供されるタイムスタンププロパティのいずれかを識別する必要があります。パラメータが渡されない場合、endMark
はperformance.now()
になります。それ以外の場合、名前付きのendMark
が存在しない場合、エラーがスローされます。
作成されたPerformanceMeasure
エントリはグローバルパフォーマンスタイムラインに配置され、performance.getEntries
、performance.getEntriesByName
、performance.getEntriesByType
を使用して照会できます。観測が実行されると、エントリはperformance.clearMeasures
を使用してグローバルパフォーマンスタイムラインから手動でクリアする必要があります。
performance.nodeTiming
追加版: v8.5.0
このプロパティは Node.js による拡張です。Web ブラウザでは利用できません。
PerformanceNodeTiming
クラスのインスタンスで、特定の Node.js 操作上のマイルストーンのパフォーマンスメトリックを提供します。
performance.now()
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバとしてperformance オブジェクトを使用して呼び出す必要があります。 |
v8.5.0 | 追加版: v8.5.0 |
- 戻り値: <number>
現在の高解像度ミリ秒タイムスタンプを返します。0 は現在のnode
プロセスの開始を表します。
performance.setResourceTimingBufferSize(maxSize)
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバとしてperformance オブジェクトを使用して呼び出す必要があります。 |
v18.8.0 | 追加版: v18.8.0 |
グローバルパフォーマンスリソースタイミングバッファサイズを、指定された数の「リソース」タイプのパフォーマンスエントリオブジェクトに設定します。
デフォルトでは、最大バッファサイズは 250 に設定されています。
performance.timeOrigin
追加版: v8.5.0
timeOrigin
は、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'
イベントタイプに購読する必要があります。
import { performance, PerformanceObserver } from 'node:perf_hooks'
function someFunction() {
console.log('hello world')
}
const wrapped = performance.timerify(someFunction)
const obs = new PerformanceObserver(list => {
console.log(list.getEntries()[0].duration)
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'] })
// パフォーマンスタイムラインエントリが作成されます
wrapped()
const { performance, PerformanceObserver } = require('node:perf_hooks')
function someFunction() {
console.log('hello world')
}
const wrapped = performance.timerify(someFunction)
const obs = new PerformanceObserver(list => {
console.log(list.getEntries()[0].duration)
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'] })
// パフォーマンスタイムラインエントリが作成されます
wrapped()
ラップされた関数が Promise を返す場合、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
- 拡張元: <PerformanceEntry>
このクラスは 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 |
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 |
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.name
が HttpClient
と等しい場合、detail
は次のプロパティを含みます:req
, res
。そして req
プロパティは method
, url
, headers
を含む <Object> であり、res
プロパティは statusCode
, statusMessage
, headers
を含む <Object> になります。
performanceEntry.name
が HttpRequest
と等しい場合、detail
は次のプロパティを含みます:req
, res
。そして req
プロパティは method
, url
, headers
を含む <Object> であり、res
プロパティは statusCode
, statusMessage
, headers
を含む <Object> になります。
これは追加のメモリオーバーヘッドを引き起こす可能性があり、診断目的でのみ使用すべきであり、デフォルトで本番環境で有効にしたままにしておくべきではありません。
HTTP/2 ('http2') 詳細
performanceEntry.type
が'http2'
の場合、performanceNodeEntry.detail
プロパティは、追加のパフォーマンス情報を含むオブジェクトになります。
performanceEntry.name
がHttp2Stream
の場合、detail
には以下のプロパティが含まれます。
bytesRead
数値 このHttp2Stream
で受信したDATA
フレームのバイト数。bytesWritten
数値 このHttp2Stream
で送信したDATA
フレームのバイト数。id
数値 関連付けられたHttp2Stream
の識別子。timeToFirstByte
数値PerformanceEntry
のstartTime
と最初のDATA
フレームの受信との間の経過時間(ミリ秒)。timeToFirstByteSent
数値PerformanceEntry
のstartTime
と最初のDATA
フレームの送信との間の経過時間(ミリ秒)。timeToFirstHeader
数値PerformanceEntry
のstartTime
と最初のヘッダーの受信との間の経過時間(ミリ秒)。
performanceEntry.name
がHttp2Session
の場合、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.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 による拡張です。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>
uv_metrics_info
関数のラッパーです。現在のイベントループメトリクスのセットを返します。
現在のループ反復中にスケジュールされたすべての操作を完了する前にメトリクスを収集するのを避けるために、setImmediate
を使用して実行がスケジュールされた関数内でこのプロパティを使用することをお勧めします。
const { performance } = require('node:perf_hooks')
setImmediate(() => {
console.log(performance.nodeTiming.uvMetricsInfo)
})
import { performance } from 'node:perf_hooks'
setImmediate(() => {
console.log(performance.nodeTiming.uvMetricsInfo)
})
performanceNodeTiming.v8Start
追加:v8.5.0
V8 プラットフォームが初期化されたときの、高解像度のミリ秒単位のタイムスタンプ。
クラス: PerformanceResourceTiming
追加:v18.2.0、v16.17.0
アプリケーションのリソースの読み込みに関する詳細なネットワークタイミングデータを提供します。
このクラスのコンストラクタは、ユーザーには直接公開されていません。
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.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなくERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v8.5.0 | 追加: v8.5.0 |
callback
<Function>list
<PerformanceObserverEntryList>observer
<PerformanceObserver>
PerformanceObserver
オブジェクトは、新しいPerformanceEntry
インスタンスがパフォーマンスタイムラインに追加されたときに通知を提供します。
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries())
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark'], buffered: true })
performance.mark('test')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries())
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark'], buffered: true })
performance.mark('test')
PerformanceObserver
インスタンスは独自の追加のパフォーマンスオーバーヘッドを導入するため、インスタンスを無期限に通知に購読したままにしておくべきではありません。ユーザーは、必要なくなった時点でオブザーバーを切断する必要があります。
callback
は、PerformanceObserver
が新しいPerformanceEntry
インスタンスについて通知されたときに呼び出されます。コールバックはPerformanceObserverEntryList
インスタンスとPerformanceObserver
への参照を受け取ります。
performanceObserver.disconnect()
追加: v8.5.0
PerformanceObserver
インスタンスをすべての通知から切断します。
performanceObserver.observe(options)
[履歴]
バージョン | 変更 |
---|---|
v16.7.0 | Performance Timeline Level 2 に準拠するように更新されました。buffered オプションが追加されました。 |
v16.0.0 | User Timing Level 3 に準拠するように更新されました。buffered オプションが削除されました。 |
v8.5.0 | 追加: v8.5.0 |
options
<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> インスタンスの通知にサブスクライブします。
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}`)
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[]>
performanceEntry.startTime
に関して時系列順に並べられたPerformanceEntry
オブジェクトのリストを返します。
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntries())
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 81.465639,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 81.860064,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntries())
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 81.465639,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 81.860064,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
performanceObserverEntryList.getEntriesByName(name[, type])
追加: v8.5.0
name
<string>type
<string>- 戻り値: <PerformanceEntry[]>
performanceEntry.name
がname
と等しく、オプションでperformanceEntry.entryType
がtype
と等しいPerformanceEntry
オブジェクトのリストを、performanceEntry.startTime
に関して時系列順に返します。
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByName('meow'))
/**
* [
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 98.545991,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('nope')) // []
console.log(perfObserverList.getEntriesByName('test', 'mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 63.518931,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('test', 'measure')) // []
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark', 'measure'] })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByName('meow'))
/**
* [
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 98.545991,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('nope')) // []
console.log(perfObserverList.getEntriesByName('test', 'mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 63.518931,
* duration: 0,
* detail: null
* }
* ]
*/
console.log(perfObserverList.getEntriesByName('test', 'measure')) // []
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['mark', 'measure'] })
performance.mark('test')
performance.mark('meow')
performanceObserverEntryList.getEntriesByType(type)
追加日時: v8.5.0
type
<string>- 戻り値: <PerformanceEntry[]>
performanceEntry.entryType
がtype
と等しいPerformanceEntry
オブジェクトのリストを、performanceEntry.startTime
に関して時系列順に返します。
import { performance, PerformanceObserver } from 'node:perf_hooks'
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByType('mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 55.897834,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 56.350146,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const obs = new PerformanceObserver((perfObserverList, observer) => {
console.log(perfObserverList.getEntriesByType('mark'))
/**
* [
* PerformanceEntry {
* name: 'test',
* entryType: 'mark',
* startTime: 55.897834,
* duration: 0,
* detail: null
* },
* PerformanceEntry {
* name: 'meow',
* entryType: 'mark',
* startTime: 56.350146,
* duration: 0,
* detail: null
* }
* ]
*/
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ type: 'mark' })
performance.mark('test')
performance.mark('meow')
perf_hooks.createHistogram([options])
追加日時: v15.9.0, v14.18.0
options
<Object>
<RecordableHistogram>を返します。
perf_hooks.monitorEventLoopDelay([options])
追加日時: v11.10.0
options
<Object>resolution
<number> サンプリングレート(ミリ秒)。0 より大きくする必要があります。デフォルト:10
。
戻り値: <IntervalHistogram>
このプロパティは Node.js による拡張です。Web ブラウザでは利用できません。
時間経過に伴うイベントループの遅延をサンプリングして報告するIntervalHistogram
オブジェクトを作成します。遅延はナノ秒単位で報告されます。
タイマーを使用してイベントループの遅延を検出する方法が機能するのは、タイマーの実行が libuv イベントループのライフサイクルに特に関わっているためです。つまり、ループの遅延はタイマーの実行の遅延を引き起こし、これらの遅延は、この API が検出することを目的としたものです。
import { monitorEventLoopDelay } from 'node:perf_hooks'
const h = monitorEventLoopDelay({ resolution: 20 })
h.enable()
// 何らかの処理を実行します。
h.disable()
console.log(h.min)
console.log(h.max)
console.log(h.mean)
console.log(h.stddev)
console.log(h.percentiles)
console.log(h.percentile(50))
console.log(h.percentile(99))
const { monitorEventLoopDelay } = require('node:perf_hooks')
const h = monitorEventLoopDelay({ resolution: 20 })
h.enable()
// 何らかの処理を実行します。
h.disable()
console.log(h.min)
console.log(h.max)
console.log(h.mean)
console.log(h.stddev)
console.log(h.percentiles)
console.log(h.percentile(50))
console.log(h.percentile(99))
クラス: Histogram
追加日時: v11.10.0
histogram.count
追加日時: v17.4.0, v16.14.0
ヒストグラムによって記録されたサンプルの数。
histogram.countBigInt
追加日時: v17.4.0, v16.14.0
ヒストグラムによって記録されたサンプルの数。
histogram.exceeds
追加日時: v11.10.0
イベントループ遅延が最大 1 時間のイベントループ遅延閾値を超えた回数。
histogram.exceedsBigInt
追加日時: v17.4.0, v16.14.0
イベントループ遅延が最大 1 時間のイベントループ遅延閾値を超えた回数。
histogram.max
追加日時: v11.10.0
記録されたイベントループ遅延の最大値。
histogram.maxBigInt
追加日時: v17.4.0, v16.14.0
記録されたイベントループ遅延の最大値。
histogram.mean
追加日時: v11.10.0
記録されたイベントループ遅延の平均値。
histogram.min
追加日時: v11.10.0
記録されたイベントループ遅延の最小値。
histogram.minBigInt
追加日時: v17.4.0, v16.14.0
記録されたイベントループ遅延の最小値。
histogram.percentile(percentile)
追加日時: v11.10.0
指定されたパーセンタイルの値を返します。
histogram.percentileBigInt(percentile)
追加日時: v17.4.0, v16.14.0
指定されたパーセンタイルの値を返します。
histogram.percentiles
追加日時: v11.10.0
累積パーセンタイル分布の詳細を記述したMap
オブジェクトを返します。
histogram.percentilesBigInt
追加日時: v17.4.0, v16.14.0
累積パーセンタイル分布の詳細を記述したMap
オブジェクトを返します。
histogram.reset()
追加日時: v11.10.0
収集されたヒストグラムデータをリセットします。
histogram.stddev
追加日時: v11.10.0
記録されたイベントループ遅延の標準偏差。
クラス: IntervalHistogram extends Histogram
指定された間隔で定期的に更新されるHistogram
。
histogram.disable()
追加日時: v11.10.0
- 戻り値: <boolean>
更新間隔タイマーを無効にします。タイマーが停止された場合はtrue
、既に停止されている場合はfalse
を返します。
histogram.enable()
追加日時: v11.10.0
- 戻り値: <boolean>
更新間隔タイマーを有効にします。タイマーが開始された場合は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
<RecordableHistogram>
other
の値をこのヒストグラムに追加します。
histogram.record(val)
追加日時: v15.9.0, v14.18.0
histogram.recordDelta()
追加日時: v15.9.0, v14.18.0
recordDelta()
への前回の呼び出し以降に経過した時間(ナノ秒単位)を計算し、その量をヒストグラムに記録します。
例
非同期操作の期間の測定
次の例では、非同期フックとパフォーマンス API を使用して、タイムアウト操作の実際の期間(コールバックの実行にかかった時間も含む)を測定します。
import { createHook } from 'node:async_hooks'
import { performance, PerformanceObserver } from 'node:perf_hooks'
const set = new Set()
const hook = createHook({
init(id, type) {
if (type === 'Timeout') {
performance.mark(`Timeout-${id}-Init`)
set.add(id)
}
},
destroy(id) {
if (set.has(id)) {
set.delete(id)
performance.mark(`Timeout-${id}-Destroy`)
performance.measure(`Timeout-${id}`, `Timeout-${id}-Init`, `Timeout-${id}-Destroy`)
}
},
})
hook.enable()
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries()[0])
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['measure'], buffered: true })
setTimeout(() => {}, 1000)
'use strict'
const async_hooks = require('node:async_hooks')
const { performance, PerformanceObserver } = require('node:perf_hooks')
const set = new Set()
const hook = async_hooks.createHook({
init(id, type) {
if (type === 'Timeout') {
performance.mark(`Timeout-${id}-Init`)
set.add(id)
}
},
destroy(id) {
if (set.has(id)) {
set.delete(id)
performance.mark(`Timeout-${id}-Destroy`)
performance.measure(`Timeout-${id}`, `Timeout-${id}-Init`, `Timeout-${id}-Destroy`)
}
},
})
hook.enable()
const obs = new PerformanceObserver((list, observer) => {
console.log(list.getEntries()[0])
performance.clearMarks()
performance.clearMeasures()
observer.disconnect()
})
obs.observe({ entryTypes: ['measure'], buffered: true })
setTimeout(() => {}, 1000)
依存関係の読み込みにかかる時間の計測
以下の例は、依存関係を読み込むrequire()
操作の時間を計測します。
import { performance, PerformanceObserver } from 'node:perf_hooks'
// オブザーバーを有効化
const obs = new PerformanceObserver(list => {
const entries = list.getEntries()
entries.forEach(entry => {
console.log(`import('${entry[0]}')`, entry.duration)
})
performance.clearMarks()
performance.clearMeasures()
obs.disconnect()
})
obs.observe({ entryTypes: ['function'], buffered: true })
const timedImport = performance.timerify(async module => {
return await import(module)
})
await timedImport('some-module')
'use strict'
const { performance, PerformanceObserver } = require('node:perf_hooks')
const mod = require('node:module')
// 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 リクエストの場合、リクエストの受信とレスポンスの送信の間の時間間隔を意味します。
import { PerformanceObserver } from 'node:perf_hooks'
import { createServer, get } from 'node:http'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['http'] })
const PORT = 8080
createServer((req, res) => {
res.end('ok')
}).listen(PORT, () => {
get(`http://127.0.0.1:${PORT}`)
})
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const http = require('node:http')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['http'] })
const PORT = 8080
http
.createServer((req, res) => {
res.end('ok')
})
.listen(PORT, () => {
http.get(`http://127.0.0.1:${PORT}`)
})
net.connect
(TCP のみ) の接続成功にかかる時間の測定
import { PerformanceObserver } from 'node:perf_hooks'
import { connect, createServer } from 'node:net'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['net'] })
const PORT = 8080
createServer(socket => {
socket.destroy()
}).listen(PORT, () => {
connect(PORT)
})
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const net = require('node:net')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['net'] })
const PORT = 8080
net
.createServer(socket => {
socket.destroy()
})
.listen(PORT, () => {
net.connect(PORT)
})
DNS リクエスト成功にかかる時間の測定
import { PerformanceObserver } from 'node:perf_hooks'
import { lookup, promises } from 'node:dns'
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['dns'] })
lookup('localhost', () => {})
promises.resolve('localhost')
'use strict'
const { PerformanceObserver } = require('node:perf_hooks')
const dns = require('node:dns')
const obs = new PerformanceObserver(items => {
items.getEntries().forEach(item => {
console.log(item)
})
})
obs.observe({ entryTypes: ['dns'] })
dns.lookup('localhost', () => {})
dns.promises.resolve('localhost')