パフォーマンス測定 API
ソースコード: lib/perf_hooks.js
このモジュールは、W3C Web Performance APIs のサブセットと、Node.js 固有のパフォーマンス測定のための追加 API の実装を提供します。
Node.js は、以下の Web Performance APIs をサポートしています。
import { performance, PerformanceObserver } from 'node:perf_hooks';
const obs = new PerformanceObserver((items) => {
console.log(items.getEntries()[0].duration);
performance.clearMarks();
});
obs.observe({ type: 'measure' });
performance.measure('Start to Now');
performance.mark('A');
doSomeLongRunningProcess(() => {
performance.measure('A to Now', 'A');
performance.mark('B');
performance.measure('A to B', 'A', 'B');
});
const { PerformanceObserver, performance } = require('node:perf_hooks');
const obs = new PerformanceObserver((items) => {
console.log(items.getEntries()[0].duration);
});
obs.observe({ type: 'measure' });
performance.measure('Start to Now');
performance.mark('A');
(async function doSomeLongRunningProcess() {
await new Promise((r) => setTimeout(r, 5000));
performance.measure('A to Now', 'A');
performance.mark('B');
performance.measure('A to B', 'A', 'B');
})();
perf_hooks.performance
追加: v8.5.0
現在の Node.js インスタンスからパフォーマンスメトリクスを収集するために使用できるオブジェクト。 ブラウザの window.performance
と同様です。
performance.clearMarks([name])
[履歴]
バージョン | 変更点 |
---|---|
v19.0.0 | このメソッドは、レシーバーとして performance オブジェクトを指定して呼び出す必要があります。 |
v8.5.0 | Added in: v8.5.0 |
name
<string>
name
が指定されていない場合、Performance Timeline からすべての PerformanceMark
オブジェクトを削除します。 name
が指定されている場合は、指定された名前のマークのみを削除します。
performance.clearMeasures([name])
[履歴]
バージョン | 変更点 |
---|---|
v19.0.0 | このメソッドは、レシーバーとして performance オブジェクトを指定して呼び出す必要があります。 |
v16.7.0 | Added in: v16.7.0 |
name
<string>
name
が指定されていない場合、Performance Timeline からすべての PerformanceMeasure
オブジェクトを削除します。 name
が指定されている場合は、指定された名前のメジャーのみを削除します。
performance.clearResourceTimings([name])
[履歴]
バージョン | 変更点 |
---|---|
v19.0.0 | このメソッドは、レシーバーとして performance オブジェクトを指定して呼び出す必要があります。 |
v18.2.0, v16.17.0 | Added in: v18.2.0, v16.17.0 |
name
<string>
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 では、ブートストラップがイベントループ内で発生するため、すぐに利用可能です。
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.startTime
に関して時系列順に並んだ PerformanceEntry
オブジェクトのリストを返します。
performance.getEntriesByType(type)
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバーとして performance オブジェクトとともに呼び出す必要があります。 |
v16.7.0 | 追加: v16.7.0 |
type
<string>- 戻り値: <PerformanceEntry[]>
performanceEntry.entryType
が type
と等しい、performanceEntry.startTime
に関して時系列順に並んだ PerformanceEntry
オブジェクトのリストを返します。
performance.mark(name[, options])
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバーとして performance オブジェクトとともに呼び出す必要があります。 name 引数はオプションではなくなりました。 |
v16.0.0 | User Timing Level 3 仕様に準拠するように更新されました。 |
v8.5.0 | 追加: v8.5.0 |
Performance Timeline に新しい PerformanceMark
エントリを作成します。 PerformanceMark
は PerformanceEntry
のサブクラスであり、performanceEntry.entryType
は常に 'mark'
であり、performanceEntry.duration
は常に 0
です。 パフォーマンスマークは、Performance Timeline 内の特定の重要な瞬間をマークするために使用されます。
作成された PerformanceMark
エントリはグローバル Performance Timeline に配置され、performance.getEntries
、performance.getEntriesByName
、および performance.getEntriesByType
でクエリできます。 観測を実行する場合、エントリは performance.clearMarks
を使用してグローバル Performance Timeline から手動でクリアする必要があります。
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 |
Performance Timeline に新しい PerformanceMeasure
エントリを作成します。 PerformanceMeasure
は performanceEntry.entryType
が常に 'measure'
である PerformanceEntry
のサブクラスであり、performanceEntry.duration
は startMark
と endMark
から経過したミリ秒数を測定します。
startMark
引数は、Performance Timeline に存在する PerformanceMark
、または PerformanceNodeTiming
クラスによって提供されるタイムスタンププロパティのいずれかを識別できます。 指定された startMark
が存在しない場合は、エラーがスローされます。
オプションの endMark
引数は、Performance Timeline に存在する PerformanceMark
、または PerformanceNodeTiming
クラスによって提供されるタイムスタンププロパティのいずれかを識別する必要があります。 パラメータが渡されない場合、endMark
は performance.now()
になり、それ以外の場合、指定された endMark
が存在しない場合は、エラーがスローされます。
作成された PerformanceMeasure
エントリはグローバル Performance Timeline に配置され、performance.getEntries
、performance.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.0 | Added in: v8.5.0 |
- 戻り値: <number>
現在の高解像度ミリ秒タイムスタンプを返します。ここで、0は現在のnode
プロセスの開始を表します。
performance.setResourceTimingBufferSize(maxSize)
[履歴]
バージョン | 変更 |
---|---|
v19.0.0 | このメソッドは、レシーバーとしてperformance オブジェクトとともに呼び出す必要があります。 |
v18.8.0 | Added 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.0 | Added in: 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
グローバルな 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 |
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
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.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
プロパティは、追加のパフォーマンス情報を含む<Object>になります。
performanceEntry.name
が Http2Stream
と等しい場合、detail
には次のプロパティが含まれます。
bytesRead
<number> このHttp2Stream
に対して受信したDATA
フレームのバイト数。bytesWritten
<number> このHttp2Stream
に対して送信したDATA
フレームのバイト数。id
<number> 関連するHttp2Stream
の識別子。timeToFirstByte
<number>PerformanceEntry
のstartTime
から最初のDATA
フレームを受信するまでの経過時間(ミリ秒単位)。timeToFirstByteSent
<number>PerformanceEntry
のstartTime
から最初のDATA
フレームを送信するまでの経過時間(ミリ秒単位)。timeToFirstHeader
<number>PerformanceEntry
のstartTime
から最初のヘッダーを受信するまでの経過時間(ミリ秒単位)。
performanceEntry.name
が Http2Session
と等しい場合、detail
には次のプロパティが含まれます。
bytesRead
<number> このHttp2Session
に対して受信したバイト数。bytesWritten
<number> このHttp2Session
に対して送信したバイト数。framesReceived
<number>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.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
の結果と同じです。
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>
これは 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
Added in: v8.5.0
V8プラットフォームが初期化された高解像度ミリ秒のタイムスタンプ。
Class: PerformanceResourceTiming
Added in: v18.2.0, v16.17.0
- Extends: <PerformanceEntry>
アプリケーションのリソースのロードに関する詳細なネットワークタイミングデータを提供します。
このクラスのコンストラクターは、ユーザーに直接公開されていません。
performanceResourceTiming.workerStart
[History]
Version | Changes |
---|---|
v19.0.0 | このプロパティゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。 |
v18.2.0, v16.17.0 | Added in: v18.2.0, v16.17.0 |
fetch
リクエストのディスパッチ直前の高解像度ミリ秒のタイムスタンプ。 リソースがワーカーによってインターセプトされない場合、このプロパティは常に0を返します。
performanceResourceTiming.redirectStart
[History]
Version | Changes |
---|---|
v19.0.0 | このプロパティゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。 |
v18.2.0, v16.17.0 | Added in: v18.2.0, v16.17.0 |
リダイレクトを開始するfetchの開始時刻を表す高解像度ミリ秒のタイムスタンプ。
performanceResourceTiming.redirectEnd
[History]
Version | Changes |
---|---|
v19.0.0 | このプロパティゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。 |
v18.2.0, v16.17.0 | Added in: v18.2.0, v16.17.0 |
最後のリダイレクトのレスポンスの最後のバイトを受信した直後に作成される高解像度ミリ秒のタイムスタンプ。
performanceResourceTiming.fetchStart
[History]
Version | Changes |
---|---|
v19.0.0 | このプロパティのゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。 |
v18.2.0, v16.17.0 | Added in: v18.2.0, v16.17.0 |
Node.js がリソースのフェッチを開始する直前の高解像度ミリ秒タイムスタンプ。
performanceResourceTiming.domainLookupStart
[History]
Version | Changes |
---|---|
v19.0.0 | このプロパティのゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。 |
v18.2.0, v16.17.0 | Added in: v18.2.0, v16.17.0 |
Node.js がリソースのドメイン名ルックアップを開始する直前の高解像度ミリ秒タイムスタンプ。
performanceResourceTiming.domainLookupEnd
[History]
Version | Changes |
---|---|
v19.0.0 | このプロパティのゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。 |
v18.2.0, v16.17.0 | Added in: v18.2.0, v16.17.0 |
Node.js がリソースのドメイン名ルックアップを完了した直後の時間を表す高解像度ミリ秒タイムスタンプ。
performanceResourceTiming.connectStart
[History]
Version | Changes |
---|---|
v19.0.0 | このプロパティのゲッターは、PerformanceResourceTiming オブジェクトをレシーバーとして呼び出す必要があります。 |
v18.2.0, v16.17.0 | Added in: 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 |
適用された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.0 | callback 引数に無効なコールバックを渡すと、ERR_INVALID_CALLBACK ではなく ERR_INVALID_ARG_TYPE がスローされるようになりました。 |
v8.5.0 | 追加: v8.5.0 |
callback
<Function>list
<PerformanceObserverEntryList>observer
<PerformanceObserver>
PerformanceObserver
オブジェクトは、新しい PerformanceEntry
インスタンスが Performance Timeline に追加されたときに通知を提供します。
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>インスタンスを、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])
Added in: 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)
Added in: 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])
Added in: v15.9.0, v14.18.0
options
<Object>
<RecordableHistogram> を返します。
perf_hooks.monitorEventLoopDelay([options])
Added in: v11.10.0
options
<Object>resolution
<number> サンプリングレート(ミリ秒単位)。ゼロより大きくなければなりません。デフォルト:10
。
戻り値: <IntervalHistogram>
このプロパティはNode.jsによる拡張です。Webブラウザーでは利用できません。
時間経過に伴うイベントループの遅延をサンプリングして報告するIntervalHistogram
オブジェクトを作成します。遅延はナノ秒単位で報告されます。
タイマーを使用してイベントループのおおよその遅延を検出するのは、タイマーの実行がlibuvイベントループのライフサイクルに具体的に結びついているためです。つまり、ループの遅延はタイマーの実行の遅延を引き起こし、それらの遅延は具体的にこのAPIが検出することを意図しているものです。
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));
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
指定されたパーセンタイルの値を返します。
histogram.percentileBigInt(percentile)
Added in: v17.4.0, v16.14.0
指定されたパーセンタイルの値を返します。
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
- 戻り値: <boolean>
更新間隔タイマーを無効にします。タイマーが停止した場合は true
、すでに停止していた場合は false
を返します。
histogram.enable()
Added in: v11.10.0
- 戻り値: <boolean>
更新間隔タイマーを有効にします。タイマーが開始された場合は 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
<RecordableHistogram>
other
の値をこのヒストグラムに追加します。
histogram.record(val)
追加: v15.9.0, v14.18.0
histogram.recordDelta()
追加: v15.9.0, v14.18.0
recordDelta()
の前回の呼び出しから経過した時間(ナノ秒単位)を計算し、その量をヒストグラムに記録します。
例
非同期操作の期間の測定
次の例では、Async Hooks および Performance API を使用して、Timeout 操作の実際の期間 (コールバックの実行にかかった時間を含む) を測定します。
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');