واجهات برمجة تطبيقات قياس الأداء
[مستقر: 2 - مستقر]
مستقر: 2 الاستقرار: 2 - مستقر
كود المصدر: lib/perf_hooks.js
توفر هذه الوحدة تنفيذًا لمجموعة فرعية من واجهات برمجة تطبيقات أداء الويب الخاصة بـ W3C بالإضافة إلى واجهات برمجة تطبيقات إضافية لقياسات الأداء الخاصة بـ Node.js.
يدعم Node.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');
});
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> نتيجة لاستدعاء سابق لـeventLoopUtilization()
قبلutilization1
.- إرجاع: <Object>
تُرجع الطريقة eventLoopUtilization()
كائنًا يحتوي على المدة التراكمية للوقت الذي كان فيه حلقة الأحداث خاملاً ونشطًا كمؤقت بالمللي ثانية عالي الدقة. قيمة utilization
هي حساب استغلال حلقة الأحداث (ELU).
إذا لم يتم الانتهاء من التهيئة بعد على الخيط الرئيسي، فإن للخصائص قيمة 0
. يتوفر ELU على الفور على خيوط العامل نظرًا لأن التهيئة تحدث داخل حلقة الأحداث.
كل من utilization1
و utilization2
هما معلمات اختيارية.
إذا تم تمرير utilization1
، فسيتم حساب الفرق بين أوقات active
و idle
للاستدعاء الحالي، بالإضافة إلى قيمة utilization
المقابلة وإرجاعها (على غرار process.hrtime()
).
إذا تم تمرير كل من utilization1
و utilization2
، فسيتم حساب الفرق بين الوسيطتين. هذا خيار مناسب لأنه، على عكس process.hrtime()
، فإن حساب ELU أكثر تعقيدًا من طرح واحد.
يشبه ELU استخدام وحدة المعالجة المركزية (CPU)، إلا أنه يقيس فقط إحصائيات حلقة الأحداث وليس استخدام وحدة المعالجة المركزية. إنه يمثل النسبة المئوية للوقت الذي قضيته حلقة الأحداث خارج موفر أحداث حلقة الأحداث (على سبيل المثال epoll_wait
). لا يتم أخذ أي وقت آخر لخمول وحدة المعالجة المركزية في الاعتبار. فيما يلي مثال على كيفية حصول عملية خاملة في الغالب على 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);
});
على الرغم من أن وحدة المعالجة المركزية خاملة في الغالب أثناء تشغيل هذا البرنامج النصي، إلا أن قيمة utilization
هي 1
. هذا لأن الاستدعاء إلى child_process.spawnSync()
يمنع حلقة الأحداث من المضي قدمًا.
سيؤدي تمرير كائن معرف من قبل المستخدم بدلاً من نتيجة استدعاء سابق لـ eventLoopUtilization()
إلى سلوك غير محدد. لا يتم ضمان أن تعكس القيم المرجعة أي حالة صحيحة لحلقة الأحداث.
performance.getEntries()
[السجل]
الإصدار | التغييرات |
---|---|
v19.0.0 | يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبل. |
v16.7.0 | تمت إضافته في: v16.7.0 |
- إرجاع: <PerformanceEntry[]>
إرجاع قائمة بكائنات PerformanceEntry
بترتيب زمني بالنسبة إلى performanceEntry.startTime
. إذا كنت مهتمًا فقط بإدخالات الأداء لأنواع معينة أو بأسماء معينة، فراجع performance.getEntriesByType()
و performance.getEntriesByName()
.
performance.getEntriesByName(name[, type])
[السجل]
الإصدار | التغييرات |
---|---|
v19.0.0 | يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبل. |
v16.7.0 | تمت إضافته في: v16.7.0 |
name
<string>type
<string>- إرجاع: <PerformanceEntry[]>
إرجاع قائمة بكائنات PerformanceEntry
بترتيب زمني بالنسبة إلى performanceEntry.startTime
حيث يكون performanceEntry.name
مساويًا لـ name
، واختياريًا، يكون performanceEntry.entryType
مساويًا لـ type
.
performance.getEntriesByType(type)
[السجل]
الإصدار | التغييرات |
---|---|
v19.0.0 | يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبل. |
v16.7.0 | تمت إضافته في: v16.7.0 |
type
<string>- إرجاع: <PerformanceEntry[]>
إرجاع قائمة بكائنات PerformanceEntry
بترتيب زمني بالنسبة إلى performanceEntry.startTime
حيث يكون performanceEntry.entryType
مساويًا لـ type
.
performance.mark(name[, options])
[السجل]
الإصدار | التغييرات |
---|---|
v19.0.0 | يجب استدعاء هذه الطريقة باستخدام كائن performance كمستقبل. لم يعد وسيط الاسم اختياريًا. |
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> معلومات توقيت الجلبrequestedUrl
<string> عنوان URL للموردinitiatorType
<string> اسم البادئ، على سبيل المثال: 'fetch'global
<Object>cacheMode
<string> يجب أن يكون وضع التخزين المؤقت سلسلة فارغة ('') أو 'local'bodyInfo
<Object> معلومات جسم استجابة الجلبresponseStatus
<number> رمز حالة الاستجابةdeliveryType
<string> نوع التسليم. افتراضي:''
.
هذه الخاصية هي امتداد بواسطة Node.js. وهي غير متوفرة في متصفحات الويب.
ينشئ إدخال 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 | تم تحديثه ليتوافق مع مواصفات توقيت المستخدم المستوى 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
جديدًا في خط زمني الأداء (Performance Timeline). 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 |
- إرجاع: <number>
إرجاع الطابع الزمني الحالي بالمللي ثانية عالي الدقة، حيث يمثل 0 بداية عملية node
الحالية.
performance.setResourceTimingBufferSize(maxSize)
[السجل]
الإصدار | التغييرات |
---|---|
v19.0.0 | يجب استدعاء هذه الطريقة مع كائن performance كجهاز استقبال. |
v18.8.0 | تمت الإضافة في: v18.8.0 |
يضبط حجم المخزن المؤقت لتوقيت موارد الأداء العام على العدد المحدد من كائنات إدخال أداء من نوع "resource".
افتراضيًا، يتم تعيين الحد الأقصى لحجم المخزن المؤقت على 250.
performance.timeOrigin
تمت الإضافة في: v8.5.0
يحدد timeOrigin
الطابع الزمني بالمللي ثانية عالي الدقة الذي بدأت عنده عملية node
الحالية، ويقاس بالوقت Unix.
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. وهي غير متاحة في متصفحات الويب.
يلف دالة داخل دالة جديدة تقيس وقت تشغيل الدالة الملتفة. يجب الاشتراك في 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();
إذا كانت الدالة الملتفة ترجع وعدًا، فسيتم إرفاق معالج نهائي بالوعد وسيتم الإبلاغ عن المدة بمجرد استدعاء المعالج النهائي.
performance.toJSON()
[التاريخ]
الإصدار | التغييرات |
---|---|
الإصدار v19.0.0 | يجب استدعاء هذه الطريقة مع كائن performance كمستقبل. |
الإصدار v16.1.0 | تمت الإضافة في: v16.1.0 |
كائن يمثل تمثيل JSON لكائن performance
. وهو مشابه لـ window.performance.toJSON
في المتصفحات.
الحدث: 'resourcetimingbufferfull'
تمت الإضافة في: v18.8.0
يتم إطلاق الحدث 'resourcetimingbufferfull'
عندما يكون مخزن مؤقت لتوقيت موارد الأداء العام ممتلئًا. اضبط حجم مخزن مؤقت لتوقيت الموارد باستخدام performance.setResourceTimingBufferSize()
أو امسح المخزن المؤقت باستخدام performance.clearResourceTimings()
في مستمع الأحداث للسماح بإضافة المزيد من الإدخالات إلى مخزن مؤقت لخط زمني للأداء.
الفئة: PerformanceEntry
تمت الإضافة في: v8.5.0
لا يتم عرض مُنشئ هذه الفئة للمستخدمين مباشرة.
performanceEntry.duration
[التاريخ]
الإصدار | التغييرات |
---|---|
الإصدار v19.0.0 | يجب استدعاء هذا الخاصية getter مع كائن PerformanceEntry كمستقبل. |
الإصدار v8.5.0 | تمت الإضافة في: v8.5.0 |
إجمالي عدد المللي ثانية التي انقضت لهذا الإدخال. لن تكون هذه القيمة ذات معنى لجميع أنواع إدخالات الأداء.
performanceEntry.entryType
[التاريخ]
الإصدار | التغييرات |
---|---|
الإصدار v19.0.0 | يجب استدعاء هذا الخاصية getter مع كائن 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
- يمتد من: <PerformanceEntry>
يعرض العلامات التي تم إنشاؤها عبر الطريقة Performance.mark()
.
performanceMark.detail
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v19.0.0 | يجب استدعاء أداة جلب هذه الخاصية باستخدام كائن PerformanceMark كمستقبِل. |
v16.0.0 | تمت إضافته في: v16.0.0 |
تفاصيل إضافية محددة عند الإنشاء باستخدام الطريقة Performance.mark()
.
الفئة: PerformanceMeasure
تمت إضافته في: v18.2.0, v16.17.0
- يمتد من: <PerformanceEntry>
يعرض المقاييس التي تم إنشاؤها عبر الطريقة Performance.measure()
.
لا يتم عرض مُنشئ هذه الفئة للمستخدمين مباشرةً.
performanceMeasure.detail
[سجل التغييرات]
الإصدار | التغييرات |
---|---|
v19.0.0 | يجب استدعاء أداة جلب هذه الخاصية باستخدام كائن PerformanceMeasure كمستقبِل. |
v16.0.0 | تمت إضافته في: v16.0.0 |
تفاصيل إضافية محددة عند الإنشاء باستخدام الطريقة Performance.measure()
.
الصنف: PerformanceNodeEntry
أُضيف في: الإصدار v19.0.0
- يمتد من: <PerformanceEntry>
هذا الصنف هو امتداد بواسطة 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
- يمتد: <PerformanceEntry>
هذه الخاصية هي امتداد بواسطة 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>
هذا عبارة عن غلاف لدالة 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
- يمتد من: <PerformanceEntry>
يوفر بيانات توقيت الشبكة التفصيلية المتعلقة بتحميل موارد التطبيق.
لا يتم عرض مُنشئ هذا الصنف للمستخدمين مباشرةً.
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 |
الطابع الزمني بالملي ثانية عالي الدقة الذي يمثل وقت البدء لجلب يبدأ عملية إعادة التوجيه.
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 |
إرجاع object
وهو تمثيل JSON لكائن PerformanceResourceTiming
صنف: 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 |
callback
<دالة>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)
[History]
Version | Changes |
---|---|
v16.7.0 | Updated to conform to Performance Timeline Level 2. The buffered option has been added back. |
v16.0.0 | Updated to conform to User Timing Level 3. The buffered option has been removed. |
v8.5.0 | Added in: v8.5.0 |
options
<Object>type
<string> نوع <PerformanceEntry> واحد. يجب عدم تحديده إذا تم تحديدentryTypes
بالفعل.entryTypes
<string[]> مصفوفة من السلاسل تحدد أنواع مثيلات <PerformanceEntry> التي يهتم بها المراقب. إذا لم يتم توفيرها، سيتم طرح خطأ.buffered
<boolean> إذا كانت القيمة true، فسيتم استدعاء رد اتصال المراقب مع قائمة إدخالاتPerformanceEntry
المخزنة مؤقتًا عالميًا. إذا كانت القيمة false، فسيتم إرسالPerformanceEntry
s التي تم إنشاؤها بعد نقطة زمنية معينة فقط إلى رد اتصال المراقب. الافتراضي:false
.
يقوم بتسجيل مثيل <PerformanceObserver> للإشعارات الخاصة بمثيلات <PerformanceEntry> الجديدة التي يتم تحديدها إما بواسطة options.entryTypes
أو options.type
:
import { performance, PerformanceObserver } from 'node:perf_hooks';
const obs = new PerformanceObserver((list, observer) => {
// Called once asynchronously. `list` contains three items.
});
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) => {
// Called once asynchronously. `list` contains three items.
});
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
بترتيب زمني فيما يتعلق بـ performanceEntry.startTime
.
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
بالترتيب الزمني بالنسبة إلى performanceEntry.startTime
حيث يكون performanceEntry.name
مساويًا لـ name
، واختياريًا، يكون performanceEntry.entryType
مساويًا لـ type
.
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
بترتيب زمني فيما يتعلق بـ performanceEntry.startTime
حيث performanceEntry.entryType
تساوي type
.
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>lowest
<number> | <bigint> أقل قيمة قابلة للتمييز. يجب أن تكون قيمة عدد صحيح أكبر من 0. الافتراضي:1
.highest
<number> | <bigint> أعلى قيمة قابلة للتسجيل. يجب أن تكون قيمة عدد صحيح تساوي أو أكبر من ضعف قيمةlowest
. الافتراضي:Number.MAX_SAFE_INTEGER
.figures
<number> عدد أرقام الدقة. يجب أن يكون رقمًا بين1
و5
. الافتراضي:3
.
الإرجاع: <RecordableHistogram>
إرجاع <RecordableHistogram>.
perf_hooks.monitorEventLoopDelay([options])
تمت إضافته في: الإصدار 11.10.0
options
<Object>resolution
<number> معدل أخذ العينات بالمللي ثانية. يجب أن يكون أكبر من الصفر. افتراضي:10
.
الإرجاع: <IntervalHistogram>
هذه الخاصية هي امتداد من Node.js. وهي غير متاحة في متصفحات الويب.
يقوم بإنشاء كائن 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));
الصنف: Histogram
تمت إضافته في: الإصدار 11.10.0
histogram.count
تمت إضافته في: الإصدار 17.4.0، الإصدار 16.14.0
عدد العينات المسجلة بواسطة المدرج التكراري.
histogram.countBigInt
تمت إضافته في: الإصدار 17.4.0، الإصدار 16.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
إرجاع القيمة عند النسبة المئوية المحددة.
histogram.percentileBigInt(percentile)
أُضيف في: v17.4.0, v16.14.0
إرجاع القيمة عند النسبة المئوية المحددة.
histogram.percentiles
أُضيف في: الإصدار 11.10.0
يُرجع كائن Map
يحتوي على تفاصيل التوزيع المئوي المتراكم.
histogram.percentilesBigInt
أُضيف في: الإصدار 17.4.0، 16.14.0
يُرجع كائن Map
يحتوي على تفاصيل التوزيع المئوي المتراكم.
histogram.reset()
أُضيف في: الإصدار 11.10.0
يعيد تعيين بيانات الرسم البياني المُجمّعة.
histogram.stddev
أُضيف في: الإصدار 11.10.0
الانحراف المعياري لتأخيرات حلقة الأحداث المسجلة.
الصنف: IntervalHistogram extends Histogram
عبارة عن Histogram
يتم تحديثها دوريًا على فترات زمنية محددة.
histogram.disable()
أُضيف في: الإصدار 11.10.0
- يُرجع: <boolean>
يُعطّل مؤقت فاصل التحديث. يُرجع true
إذا تم إيقاف المؤقت، و false
إذا كان متوقفًا بالفعل.
histogram.enable()
أُضيف في: الإصدار 11.10.0
- يُرجع: <boolean>
يُفعّل مؤقت فاصل التحديث. يُرجع true
إذا تم بدء المؤقت، و false
إذا كان قيد التشغيل بالفعل.
استنساخ IntervalHistogram
يمكن استنساخ نُسخ <IntervalHistogram> عبر <MessagePort>. في الطرف المستقبل، يتم استنساخ الرسم البياني ككائن <Histogram> عادي لا يُنفّذ طرق enable()
و disable()
.
الصنف: RecordableHistogram extends Histogram
أُضيف في: الإصدار 15.9.0، 14.18.0
histogram.add(other)
أُضيف في: الإصدار 17.4.0، 16.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 APIs لقياس المدة الفعلية لعملية المهلة (بما في ذلك مقدار الوقت الذي استغرقه تنفيذ الاستدعاء).
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';
// Activate the observer
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');
// Monkey patch the require function
mod.Module.prototype.require =
performance.timerify(mod.Module.prototype.require);
require = performance.timerify(require);
// Activate the observer
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، يعني ذلك الفترة الزمنية بين تلقي الطلب وإرسال الاستجابة:
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');