Skip to content

واجهات برمجة التطبيقات لقياس الأداء

[مستقر: 2 - مستقر]

مستقر: 2 ثبات: 2 - مستقر

المصدر: lib/perf_hooks.js

توفر هذه الوحدة تنفيذًا لمجموعة فرعية من واجهات برمجة تطبيقات الأداء على الويب من W3C واجهات برمجة تطبيقات الأداء على الويب بالإضافة إلى واجهات برمجة تطبيقات إضافية لقياسات الأداء الخاصة بـ Node.js.

يدعم Node.js واجهات برمجة تطبيقات الأداء على الويب التالية واجهات برمجة تطبيقات الأداء على الويب:

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

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبل.
v8.5.0تمت الإضافة في: v8.5.0

إذا لم يتم توفير name، فسيتم إزالة جميع كائنات PerformanceMark من جدول زمني الأداء. إذا تم توفير name، فسيتم إزالة العلامة المسمّاة فقط.

performance.clearMeasures([name])

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبل.
v16.7.0تمت الإضافة في: v16.7.0

إذا لم يتم توفير name، فسيتم إزالة جميع كائنات PerformanceMeasure من جدول زمني الأداء. إذا تم توفير name، فسيتم إزالة القياس المسمّى فقط.

performance.clearResourceTimings([name])

[History]

الإصدارالتغييرات
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> نتيجة استدعاء سابق لـ eventLoopUtilization() قبل utilization1.
  • الإرجاع: <Object>

ترجع طريقة eventLoopUtilization() كائنًا يحتوي على المدة التراكمية للوقت الذي كانت فيه حلقة الحدث خاملة وفعالة كعداد ميلي ثانية عالي الدقة. قيمة utilization هي معدل استخدام حلقة الحدث (ELU) المحسوب.

إذا لم ينتهِ التمهيد بعد على مؤشر ترابط رئيسي، فإن خصائص القيم تكون 0. يتوفر ELU على الفور على خيوط عامل نظرًا لأن التمهيد يحدث داخل حلقة الحدث.

كلا من utilization1 و utilization2 هما معاملان اختياريان.

إذا تم تمرير utilization1، فسيتم حساب الفرق بين أوقات active و idle للاستدعاء الحالي، بالإضافة إلى قيمة utilization المقابلة، ويتم إرجاعها (على غرار process.hrtime()).

إذا تم تمرير كل من utilization1 و utilization2، فسيتم حساب الفرق بين الوسيطتين. هذا خيار ملائم لأنه، على عكس process.hrtime()، فإن حساب ELU أكثر تعقيدًا من طرح واحد.

ELU مشابه لاستخدام وحدة المعالجة المركزية، إلا أنه يقيس فقط إحصائيات حلقة الحدث وليس استخدام وحدة المعالجة المركزية. إنه يمثل نسبة الوقت الذي أمضته حلقة الحدث خارج موفر حدث حلقة الحدث (مثل epoll_wait). لا يُؤخذ أي وقت خاملة آخر لوحدة المعالجة المركزية في الاعتبار. فيما يلي مثال لكيفية امتلاك عملية خاملة في الغالب لـ 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)
})

على الرغم من أن وحدة المعالجة المركزية خاملة في الغالب أثناء تشغيل هذا البرنامج النصي، إلا أن قيمة utilization هي 1. هذا لأنه يمنع استدعاء child_process.spawnSync() حلقة الحدث من المتابعة.

سيؤدي تمرير كائن محدد من قبل المستخدم بدلاً من نتيجة استدعاء سابق لـ eventLoopUtilization() إلى سلوك غير محدد. لا يُضمن أن تعكس قيم الإرجاع أي حالة صحيحة لحلقة الحدث.

performance.getEntries()

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبِل.
v16.7.0تمت الإضافة في: v16.7.0

يُرجِع قائمة من كائنات PerformanceEntry بترتيب زمني فيما يتعلق بـ performanceEntry.startTime. إذا كنت مهتمًا فقط بإدخالات الأداء لأنواع معينة أو لها أسماء معينة، فراجع performance.getEntriesByType() و performance.getEntriesByName().

performance.getEntriesByName(name[, type])

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبِل.
v16.7.0تمت الإضافة في: v16.7.0

يُرجِع قائمة من كائنات PerformanceEntry بترتيب زمني فيما يتعلق بـ performanceEntry.startTime حيث يكون performanceEntry.name مساويًا لـ name، واختياريًا، حيث يكون performanceEntry.entryType مساويًا لـ type.

performance.getEntriesByType(type)

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبِل.
v16.7.0تمت الإضافة في: v16.7.0

يُرجِع قائمة من كائنات PerformanceEntry بترتيب زمني فيما يتعلق بـ performanceEntry.startTime حيث يكون performanceEntry.entryType مساويًا لـ type.

performance.mark(name[, options])

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبِل. لم تعد وسيطة الاسم اختيارية.
v16.0.0تم التحديث ليتوافق مع مواصفات User Timing Level 3.
v8.5.0تمت الإضافة في: v8.5.0
  • name <string>
  • options <Object>
    • detail <any> تفاصيل إضافية اختيارية لإدراجها مع العلامة.
    • startTime <number> موعد زمني اختياري لاستخدامه كوقت للعلامة. الافتراضي: performance.now().

يُنشئ إدخال PerformanceMark جديدًا في مخطط الجدول الزمني للأداء. PerformanceMark هو فئة فرعية من PerformanceEntry حيث يكون performanceEntry.entryType دائمًا 'mark'، ويكون performanceEntry.duration دائمًا 0. تُستخدم علامات الأداء لتمييز لحظات مهمة محددة في مخطط الجدول الزمني للأداء.

يتم وضع إدخال PerformanceMark المُنشأ في مخطط الجدول الزمني العالمي للأداء ويمكن استعلامه باستخدام performance.getEntries و performance.getEntriesByName و performance.getEntriesByType. عند إجراء الملاحظة، يجب مسح الإدخالات يدويًا من مخطط الجدول الزمني العالمي للأداء باستخدام performance.clearMarks.

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

[السجل]

الإصدارالتغييرات
v22.2.0تمت إضافة الوسيطات bodyInfo و responseStatus و deliveryType.
v18.2.0، v16.17.0تمت الإضافة في: v18.2.0، v16.17.0

هذه الخاصية عبارة عن امتداد من Node.js. وهي غير متوفرة في متصفحات الويب.

يُنشئ إدخالًا جديدًا PerformanceResourceTiming في جدول زمني للموارد. PerformanceResourceTiming هي فئة فرعية من PerformanceEntry حيث يكون performanceEntry.entryType دائمًا 'resource'. تُستخدم موارد الأداء لتمييز اللحظات في الجدول الزمني للموارد.

يُوضع إدخال PerformanceMark المُنشأ في الجدول الزمني العالمي للموارد ويمكن استعلامه باستخدام performance.getEntries و performance.getEntriesByName و performance.getEntriesByType. عند إجراء الملاحظة، يجب مسح الإدخالات يدويًا من الجدول الزمني العالمي للأداء باستخدام performance.clearResourceTimings.

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

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبل.
v16.0.0تم التحديث ليتوافق مع مواصفات توقيت المستخدم المستوى 3.
v13.13.0، v12.16.3جعل المعلمتان startMark و endMark اختياريتين.
v8.5.0تمت الإضافة في: v8.5.0
  • name <string>

  • startMarkOrOptions <string> | <Object> اختياري.

    • detail <any> تفاصيل إضافية اختيارية لإدراجها مع القياس.
    • duration <number> المدة بين وقتي البدء والانتهاء.
    • end <number> | <string> مُوَقِت ليتم استخدامه كوقت انتهاء، أو سلسلة تُحدد علامة مُسجلة مسبقًا.
    • start <number> | <string> مُوَقِت ليتم استخدامه كوقت بدء، أو سلسلة تُحدد علامة مُسجلة مسبقًا.
  • endMark <string> اختياري. يجب حذفه إذا كان startMarkOrOptions <Object>.

يُنشئ مُدخلاً جديداً PerformanceMeasure في مخطط توقيت الأداء. PerformanceMeasure هو فئة فرعية من PerformanceEntry حيث يكون performanceEntry.entryType دائمًا 'measure', وحيث يقيس performanceEntry.duration عدد الميلي ثانية المنقضية منذ startMark و endMark.

قد يُحدد الوسيط startMark أي PerformanceMark موجود في مخطط توقيت الأداء، أو قد يُحدد أيًا من خصائص الموقت التي يوفرها فئة PerformanceNodeTiming. إذا لم تكن العلامة المُسماة startMark موجودة، فسيتم إطلاق خطأ.

يجب أن يُحدد الوسيط الاختياري endMark أي PerformanceMark موجود في مخطط توقيت الأداء أو أيًا من خصائص الموقت التي يوفرها فئة PerformanceNodeTiming. سيكون endMark هو performance.now() إذا لم يتم تمرير أي معلمة، وإلا، إذا لم تكن العلامة المُسماة endMark موجودة، فسيتم إطلاق خطأ.

يتم وضع مُدخَل PerformanceMeasure المُنشأ في مخطط توقيت الأداء العام ويمكن استعراضه باستخدام performance.getEntries, performance.getEntriesByName, و performance.getEntriesByType. عند إجراء الملاحظة، يجب مسح الإدخالات يدويًا من مخطط توقيت الأداء العام باستخدام performance.clearMeasures.

performance.nodeTiming

مضاف في: v8.5.0

هذه الخاصية إضافة من Node.js. ليست متوفرة في متصفحات الويب.

مثيل من فئة 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

يحدد حجم المخزن المؤقت العالمي لتوقيت موارد الأداء إلى العدد المحدد من كائنات إدخال الأداء من نوع "resource".

بحكم الإعداد الافتراضي، يتم تعيين الحد الأقصى لحجم المخزن المؤقت إلى 250.

performance.timeOrigin

مضاف في: v8.5.0

يحدد timeOrigin طابع زمني بالميللي ثانية بدقة عالية بدأت عنده عملية node الحالية، مقاسةً بزمن يونكس.

performance.timerify(fn[, options])

[السجل]

الإصدارالتغييرات
v16.0.0أضيف خيار الرسم البياني.
v16.0.0أعيد تنفيذه لاستخدام جافا سكريبت نقي والقدرة على قياس وظائف غير متزامنة.
v8.5.0مضاف في: v8.5.0
  • fn <Function>
  • options <Object>
    • histogram <RecordableHistogram> كائن رسم بياني تم إنشاؤه باستخدام perf_hooks.createHistogram() والذي سيسجل مدد وقت التشغيل بالنانوثانية.

هذه الخاصية إضافة من Node.js. ليست متوفرة في متصفحات الويب.

يُغلف دالة داخل دالة جديدة تقيس وقت تشغيل الدالة المُغلّفة. يجب اشتراك 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()

إذا كانت الدالة المُغلّفة تُرجع وعدًا، فسيتم إرفاق مُعامل finally بالوعد وسيتم الإبلاغ عن المدة بمجرد استدعاء مُعامل finally.

performance.toJSON()

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبل.
v16.1.0تمت الإضافة في: v16.1.0

كائن يمثل تمثيل JSON لكائن performance. وهو مشابه لـ window.performance.toJSON في المتصفحات.

حدث: 'resourcetimingbufferfull'

تمت الإضافة في: v18.8.0

يتم إطلاق حدث 'resourcetimingbufferfull' عندما يمتلئ المخزن المؤقت لتوقيت موارد الأداء العام. قم بضبط حجم المخزن المؤقت لتوقيت موارد الأداء باستخدام performance.setResourceTimingBufferSize() أو قم بمسح المخزن المؤقت باستخدام performance.clearResourceTimings() في مستمع الحدث للسماح بإضافة المزيد من الإدخالات إلى مخزن مؤقت جدول زمني للأداء.

Class: PerformanceEntry

تمت الإضافة في: v8.5.0

لا يُعرّض مُنشئ هذه الفئة للمستخدمين مباشرةً.

performanceEntry.duration

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceEntry كمستقبل.
v8.5.0تمت الإضافة في: v8.5.0

العدد الإجمالي للميلي ثانية المنقضية لهذا الإدخال. لن تكون هذه القيمة ذات مغزى لجميع أنواع إدخالات الأداء.

performanceEntry.entryType

[History]

الإصدارالتغييرات
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

الوقت الزمني بدقة عالية بالميلي ثانية الذي يُشير إلى وقت بدء إدخال الأداء.

Class: PerformanceMark

مُضاف في: v18.2.0، v16.17.0

يعرض العلامات المُنشأة عبر طريقة Performance.mark().

performanceMark.detail

[السجل]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceMark كمُستقبِل.
v16.0.0مُضاف في: v16.0.0

تفاصيل إضافية مُحددة عند إنشاء الطريقة باستخدام Performance.mark().

Class: 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. إنه غير متوفر في متصفحات الويب.

يوفر بيانات توقيت مفصلة من Node.js.

لا يُعرّض مُنشئ هذا الصنف للمستخدمين مباشرةً.

performanceNodeEntry.detail

[السجل]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ هذا الخاصية باستخدام كائن PerformanceNodeEntry كمستقبل.
v16.0.0مضاف في: v16.0.0

تفاصيل إضافية خاصة بـ entryType.

performanceNodeEntry.flags

[السجل]

الإصدارالتغييرات
v16.0.0عفا عليها الزمن في وقت التشغيل. تم نقلها الآن إلى خاصية التفاصيل عندما يكون entryType هو 'gc'.
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'.
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 عبارة عن <Object> مع خاصيتين:

  • kind <number> أحد ما يلي:

    • perf_hooks.constants.NODE_PERFORMANCE_GC_MAJOR
    • perf_hooks.constants.NODE_PERFORMANCE_GC_MINOR
    • perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL
    • perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
  • flags <number> أحد ما يلي:

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

تفاصيل HTTP ('http')

عندما يكون performanceEntry.type مساويًا لـ 'http'، ستكون خاصية performanceNodeEntry.detail عبارة عن <Object> تحتوي على معلومات إضافية.

إذا كان performanceEntry.name مساويًا لـ HttpClient، فستحتوي detail على الخصائص التالية: req، res. وستكون خاصية req عبارة عن <Object> تحتوي على method، url، headers، وستكون خاصية res عبارة عن <Object> تحتوي على statusCode، statusMessage، headers.

إذا كان performanceEntry.name مساويًا لـ HttpRequest، فستحتوي detail على الخصائص التالية: req، res. وستكون خاصية req عبارة عن <Object> تحتوي على method، url، headers، وستكون خاصية res عبارة عن <Object> تحتوي على statusCode، statusMessage، headers.

قد يضيف هذا عبئًا إضافيًا على الذاكرة، ويجب استخدامه فقط لأغراض التشخيص، وليس تركه قيد التشغيل في الإنتاج افتراضيًا.

تفاصيل HTTP/2 ('http2')

عندما يكون performanceEntry.type مساوياً لـ 'http2'، ستكون خاصية performanceNodeEntry.detail عبارة عن <Object> تحتوي على معلومات أداء إضافية.

إذا كان performanceEntry.name مساوياً لـ Http2Stream، فستحتوي الخاصية detail على الخصائص التالية:

  • bytesRead <number> عدد بايتات إطار DATA المستلمة لهذا Http2Stream.
  • bytesWritten <number> عدد بايتات إطار DATA المرسلة لهذا Http2Stream.
  • id <number> مُعرّف Http2Stream المرتبط.
  • timeToFirstByte <number> عدد الميلي ثانية المنقضية بين startTime لـ PerformanceEntry واستقبال أول إطار DATA.
  • timeToFirstByteSent <number> عدد الميلي ثانية المنقضية بين startTime لـ PerformanceEntry وإرسال أول إطار DATA.
  • timeToFirstHeader <number> عدد الميلي ثانية المنقضية بين startTime لـ PerformanceEntry واستقبال أول رأس.

إذا كان performanceEntry.name مساوياً لـ Http2Session، فستحتوي الخاصية detail على الخصائص التالية:

  • bytesRead <number> عدد البايتات المستلمة لهذا Http2Session.
  • bytesWritten <number> عدد البايتات المرسلة لهذا Http2Session.
  • framesReceived <number> عدد أطر HTTP/2 المستلمة بواسطة Http2Session.
  • framesSent <number> عدد أطر HTTP/2 المرسلة بواسطة Http2Session.
  • maxConcurrentStreams <number> الحد الأقصى لعدد التدفقات المفتوحة بشكل متزامن خلال عمر Http2Session.
  • pingRTT <number> عدد الميلي ثانية المنقضية منذ إرسال إطار PING واستقبال إقراره. يظهر فقط إذا تم إرسال إطار PING على Http2Session.
  • streamAverageDuration <number> متوسط المدة (بالميلي ثانية) لجميع مثيلات Http2Stream.
  • streamCount <number> عدد مثيلات Http2Stream التي تم معالجتها بواسطة Http2Session.
  • type <string> إما 'server' أو 'client' لتحديد نوع Http2Session.

تفاصيل 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

هذه الخاصية هي امتداد من Node.js. إنها غير متوفرة في متصفحات الويب.

يوفر تفاصيل التوقيت لـ 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). هذا لا يأخذ استخدام وحدة المعالجة المركزية في الاعتبار. إذا لم تبدأ حلقة الأحداث بعد (مثلًا، في أول دورة من البرنامج النصي الرئيسي)، فإن الخاصية لها قيمة 0.

performanceNodeTiming.loopExit

مضاف في: v8.5.0

الزمن الزمني بدقة عالية بالميلي ثانية عند خروج حلقة أحداث Node.js. إذا لم تخرج حلقة الأحداث بعد، فإن الخاصية لها قيمة -1. لا يمكن أن يكون لها قيمة غير -1 إلا في مُعالِج حدث 'exit'.

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

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

مُؤشّر زمني بالميلي ثانية بدقة عالية، قبل أن يبدأ Node.js في جلب المورد مباشرةً.

performanceResourceTiming.domainLookupStart

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

مُؤشّر زمني بالميلي ثانية بدقة عالية، قبل أن يبدأ Node.js في البحث عن اسم النطاق الخاص بالمورد مباشرةً.

performanceResourceTiming.domainLookupEnd

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

مُؤشّر زمني بالميلي ثانية بدقة عالية، يمثل الوقت مباشرة بعد أن ينهي Node.js البحث عن اسم النطاق الخاص بالمورد.

performanceResourceTiming.connectStart

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

مُؤشّر زمني بالميلي ثانية بدقة عالية، يمثل الوقت مباشرة قبل أن يبدأ Node.js في إنشاء الاتصال بالخادم لاسترداد المورد.

performanceResourceTiming.connectEnd

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

الزمن الزمني بدقة عالية بالميلي ثانية يمثل الوقت مباشرة بعد أن ينهي Node.js إنشاء الاتصال بالخادم لاسترداد المورد.

performanceResourceTiming.secureConnectionStart

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

الزمن الزمني بدقة عالية بالميلي ثانية يمثل الوقت مباشرة قبل أن يبدأ Node.js عملية المصافحة لتأمين الاتصال الحالي.

performanceResourceTiming.requestStart

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

الزمن الزمني بدقة عالية بالميلي ثانية يمثل الوقت مباشرة قبل أن يستقبل Node.js أول بايت من الاستجابة من الخادم.

performanceResourceTiming.responseEnd

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

الزمن الزمني بدقة عالية بالميلي ثانية يمثل الوقت مباشرة بعد أن يستقبل Node.js آخر بايت من المورد أو مباشرة قبل إغلاق اتصال النقل، أيهما يأتي أولاً.

performanceResourceTiming.transferSize

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

عدد يمثل حجم المورد المُسترد (بالبايت). يتضمن الحجم حقول رأس الاستجابة بالإضافة إلى جسم حمولة الاستجابة.

performanceResourceTiming.encodedBodySize

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

عدد يمثل الحجم (بالبايت) المُستقبَل من عملية الاسترداد (HTTP أو ذاكرة التخزين المؤقتة)، لجسم الحمولة، قبل إزالة أي ترميزات محتوى مُطبقة.

performanceResourceTiming.decodedBodySize

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء مُنشئ الخاصية هذا باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

عدد يمثل الحجم (بالبايت) المُستقبَل من عملية الاسترداد (HTTP أو ذاكرة التخزين المؤقتة)، لجسم الرسالة، بعد إزالة أي ترميزات محتوى مُطبقة.

performanceResourceTiming.toJSON()

[History]

الإصدارالتغييرات
v19.0.0يجب استدعاء هذه الطريقة باستخدام كائن PerformanceResourceTiming كمُستقبِل.
v18.2.0, v16.17.0تمت الإضافة في: v18.2.0, v16.17.0

يُعيد كائنًا وهو التمثيل JSON لكائن PerformanceResourceTiming

Class: PerformanceObserver

تمت الإضافة في: v8.5.0

PerformanceObserver.supportedEntryTypes

تمت الإضافة في: v16.0.0

الحصول على الأنواع المدعومة.

new PerformanceObserver(callback)

[السجل]

الإصدارالتغييرات
v18.0.0تمرير مُعامل استدعاء غير صحيح إلى وسيطة callback يُلقي الآن ERR_INVALID_ARG_TYPE بدلاً من ERR_INVALID_CALLBACK.
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.0تم التحديث ليتوافق مع مستوى 2 من جدول زمني للأداء. تم إضافة خيار buffered مرة أخرى.
v16.0.0تم التحديث ليتوافق مع مستوى 3 من توقيت المستخدم. تم إزالة خيار buffered.
v8.5.0تمت الإضافة في: v8.5.0
  • options <Object>
    • type <string> نوع واحد من <PerformanceEntry>. يجب عدم إعطاؤه إذا تم تحديد entryTypes بالفعل.
    • entryTypes <string[]> مصفوفة من السلاسل التي تحدد أنواع مثيلات <PerformanceEntry> التي يهتم بها المُراقب. إذا لم يتم توفيره، فسيتم إرسال خطأ.
    • buffered <boolean> إذا كان صحيحًا، فسيتم استدعاء دالة مُراقب الاستجابة بقائمة من إدخالات PerformanceEntry المخزنة مؤقتًا على مستوى النظام. إذا كان خطأ، فسيتم إرسال PerformanceEntrys التي تم إنشاؤها فقط بعد نقطة زمنية إلى دالة مُراقب الاستجابة. الافتراضي: false.

اشتراك مثيل <PerformanceObserver> في إشعارات بمثيلات جديدة من <PerformanceEntry> التي تم تحديدها إما بواسطة options.entryTypes أو options.type:

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

const obs = new PerformanceObserver((list, observer) => {
  // يتم استدعاء هذه الدالة مرة واحدة بشكل غير متزامن. تحتوي `list` على ثلاثة عناصر.
})
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` على ثلاثة عناصر.
})
obs.observe({ type: 'mark' })

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

performanceObserver.takeRecords()

مضاف في: v16.0.0

  • الإرجاع: <PerformanceEntry[]> القائمة الحالية من الإدخالات المخزنة في مراقب الأداء، ومسحها.

الصنف: PerformanceObserverEntryList

مضاف في: v8.5.0

يستخدم صنف PerformanceObserverEntryList لتوفير الوصول إلى مثيلات PerformanceEntry المُمرّرة إلى PerformanceObserver. لا يُعرّض مُنشئ هذا الصنف للمستخدمين.

performanceObserverEntryList.getEntries()

مضاف في: v8.5.0

يُعيد قائمة من كائنات PerformanceEntry بترتيب زمني وفقًا لـ performanceEntry.startTime.

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 كائنات مرتبة زمنيًا فيما يتعلق بـ performanceEntry.startTime والتي تساوي performanceEntry.name name، واختياريًا، والتي تساوي performanceEntry.entryType type.

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 كائنات مرتبة زمنيًا فيما يتعلق بـ performanceEntry.startTime التي تساوي performanceEntry.entryType قيمة type.

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. افتراضيًا: Number.MAX_SAFE_INTEGER.
    • figures <number> عدد خانات الدقة. يجب أن يكون رقمًا بين 1 و 5. افتراضيًا: 3.
  • قيمة الإرجاع: <RecordableHistogram>

يرجع <RecordableHistogram>.

perf_hooks.monitorEventLoopDelay([options])

مُضاف في: v11.10.0

  • options <Object>

    • resolution <number> معدل أخذ العينات بالمللي ثانية. يجب أن يكون أكبر من الصفر. افتراضيًا: 10.
  • الإرجاع: <IntervalHistogram>

هذه الخاصية هي امتداد من Node.js. إنها غير متوفرة في متصفحات الويب.

يُنشئ كائن IntervalHistogram يقوم بأخذ عينات وإبلاغ تأخير حلقة الحدث بمرور الوقت. سيتم الإبلاغ عن التأخيرات بالنانو ثانية.

يعمل استخدام مؤقت للكشف عن تأخير حلقة الحدث التقريبي لأن تنفيذ المؤقتات مرتبط تحديدًا بدورة حياة حلقة حدث libuv. وهذا يعني أن التأخير في الحلقة سيؤدي إلى تأخير في تنفيذ المؤقت، وهذه التأخيرات هي تحديدًا ما يهدف هذا الواجهة البرمجية إلى اكتشافه.

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

Class: 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

عدد المرات التي تجاوز فيها تأخير حلقة الحدث الحد الأقصى لتأخير حلقة الحدث لمدة ساعة واحدة.

histogram.exceedsBigInt

تم الإضافة في: v17.4.0، v16.14.0

عدد المرات التي تجاوز فيها تأخير حلقة الحدث الحد الأقصى لتأخير حلقة الحدث لمدة ساعة واحدة.

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

الانحراف المعياري لتأخيرات حلقة الحدث المسجلة.

Class: IntervalHistogram extends Histogram

Histogram يتم تحديثه بشكل دوري على فاصل زمني معين.

histogram.disable()

أضيف في: v11.10.0

يعطل مؤقت فاصل التحديث. يُرجع true إذا تم إيقاف المؤقت، false إذا كان قد تم إيقافه بالفعل.

histogram.enable()

أضيف في: v11.10.0

يُمكن مؤقت فاصل التحديث. يُرجع true إذا تم بدء تشغيل المؤقت، false إذا كان قيد التشغيل بالفعل.

استنساخ IntervalHistogram

يمكن استنساخ مثيلات <IntervalHistogram> عبر <MessagePort>. في الطرف المتلقي، يتم استنساخ الرسم البياني التكراري ككائن <Histogram> عادي لا يُنفذ طريقتي enable() و disable().

Class: 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

  • val <number> | <bigint> الكمية المراد تسجيلها في الرسم البياني.

histogram.recordDelta()

أضيف في: v15.9.0، v14.18.0

يحسب مقدار الوقت (بالنانوثانية) الذي مضى منذ المكالمة السابقة لـ recordDelta() ويسجل هذا المقدار في الرسم البياني.

أمثلة

قياس مدة العمليات غير المتزامنة

يستخدم المثال التالي Async Hooks وواجهات برمجة التطبيقات للأداء لقياس المدة الفعلية لعملية المهلة الزمنية (بما في ذلك مقدار الوقت الذي استغرقه تنفيذ دالة الاستدعاء).

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

قياس مدة رحلة 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')