واجهات برمجة تطبيقات قياس الأداء
[مستقر: 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_NOperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINEDperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCEDperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSINGperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGEperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORYperf_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_MAJORperf_hooks.constants.NODE_PERFORMANCE_GC_MINORperf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTALperf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
تفاصيل تجميع البيانات المهملة ('gc')
عندما يكون performanceEntry.type مساويًا لـ 'gc'، فإن الخاصية performanceNodeEntry.detail ستكون <Object> مع خاصيتين:
kind<number> واحد مما يلي:perf_hooks.constants.NODE_PERFORMANCE_GC_MAJORperf_hooks.constants.NODE_PERFORMANCE_GC_MINORperf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTALperf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB
flags<number> واحد مما يلي:perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NOperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINEDperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCEDperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSINGperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGEperf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORYperf_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، فسيتم إرسالPerformanceEntrys التي تم إنشاؤها بعد نقطة زمنية معينة فقط إلى رد اتصال المراقب. الافتراضي: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');