توصيف أداء كود JavaScript: إيجاد نقاط الاختناق في Node.js

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ملف تعريف أداء كود JavaScript: العثور على نقاط الاختناق في Node.js



سرعة عمل التطبيق هي أحد العوامل الرئيسية للنجاح. حتى الكود المكتوب بشكل مثالي قد يبدأ في "التباطؤ" بمرور الوقت بسبب زيادة الحمل، أو الخوارزميات غير الفعالة، أو تسرب الذاكرة. في عالم Node.js و JavaScript، يساعد ملف تعريف الأداء (profiling) في العثور على سبب التباطؤ. في هذه المقالة، سنشرح كيفية تحديد نقاط الاختناق باستخدام الأدوات المدمجة والأدوات الخارجية، وسنقدم أمثلة عملية.



ما هو ملف تعريف الأداء ولماذا هو مطلوب؟



ملف تعريف الأداء (profiling) هو عملية جمع بيانات حول كيفية استخدام البرنامج للموارد: وقت المعالج، الذاكرة، استدعاءات الدوال. يقوم أداة ملف تعريف الأداء (profiler) بتسجيل أي الدوال تستغرق وقتًا أطول في التنفيذ وكم مرة يتم استدعاؤها. وهذا يسمح للمطور بعدم التخمين، بل بمعرفة الجزء من الكود الذي يحتاج إلى تحسين بدقة.



الأهداف الرئيسية لملف تعريف الأداء:

  • تحديد "النقاط الساخنة" (hotspots) — أجزاء الكود التي تستهلك معظم الوقت.
  • البحث عن تسرب الذاكرة.
  • تحسين الخوارزميات وهياكل البيانات.
  • التحقق من كفاءة العمليات غير المتزامنة (asynchronous).


أداة ملف تعريف الأداء المدمجة في Node.js (V8)



يأتي Node.js مع أداة ملف تعريف أداء مدمجة تعتمد على محرك V8. تتيح لك جمع مكدس الاستدعاءات (call stack) ووقت تنفيذ الدوال دون تثبيت حزم إضافية.



قم بتشغيل تطبيقك مع العلامة --prof:



node --prof app.js


بعد انتهاء البرنامج من العمل، سيظهر في المجلد الحالي ملف باسم isolate-0x...-v8.log (أو ما يشبهه). للحصول على تقرير قابل للقراءة، قم بمعالجته:



node --prof-process isolate-0x...-v8.log > processed.txt


مثال على الإخراج (مبسط):



Statistical profiling result from isolate-0x... [Shared libraries]:   ticks  total  nonlib   name   100    50.0%           node::Start

[JavaScript]: ticks total nonlib name 40 20.0% 40.0% LazyCompile: *slowFunction /path/to/file.js:10 20 10.0% 20.0% LazyCompile: *fastFunction /path/to/file.js:5


هنا ticks هو عدد "النقرات" (القياسات) التي تم فيها رصد الدالة. كلما زاد عدد ticks، كانت الدالة "أثقل". في المثال، slowFunction تستهلك 40% من الوقت.



هام: أداة ملف تعريف الأداء المدمجة تعطي صورة إحصائية (عينة)، والتي قد تكون غير دقيقة للدوال السريعة جدًا.



ملف تعريف الأداء عبر Chrome DevTools



للحصول على تحليل أكثر وضوحًا، يمكنك استخدام Chrome DevTools. يدعم Node.js بروتوكول تصحيح أخطاء خاص يسمح بتوصيل أدوات المتصفح.



قم بتشغيل Node.js مع العلامة --inspect:



node --inspect app.js


سيظهر في وحدة التحكم رابط مشابه لـ chrome-devtools://devtools/bundled/.... افتحه في متصفح Chrome. ستنتقل إلى واجهة DevTools المألوفة، ولكنها مرتبطة بعملية Node.js الخاصة بك.



في علامة التبويب Profiler (أو Performance) يمكنك:

  • تسجيل ملف تعريف للأداء (Start ← Stop).
  • مشاهدة flame graph (رسم بياني اللهب)، حيث يوضح عرض "العمود" وقت تنفيذ الدالة.
  • تحليل الاستدعاءات في طرق العرض Bottom-Up أو Tree.


مثال على كود للاختبار:



// app.jsfunction heavyComputation() {    let sum = 0;    for (let i = 0; i < 1e7; i++) {        sum += Math.sqrt(i);    }    return sum;}

function main() { console.time('heavy'); const result = heavyComputation(); console.timeEnd('heavy'); console.log(result);}

main();


بعد تسجيل ملف تعريف الأداء في DevTools، سترى أن heavyComputation تستهلك ما يقرب من 100% من الوقت — وهذه هي نقطة الاختناق.



أداة متقدمة: c

المدونات

توصيات الكتب