مقدمة: لماذا تحليل الأداء أمر لا غنى عنه لكل مطور
هل سبق لك أن كتبت كودًا يعمل بشكل جيد ظاهريًا، لكنه يبدأ في "التباطؤ" عند التشغيل في بيئة الإنتاج؟ أو ربما قمت بتشغيل خادم Node.js، وبعد دقائق قليلة بدأ يستهلك كل الذاكرة؟ غالبًا ما تكمن المشكلة ليس في اللغة، بل في نقاط الاختناق — أجزاء الكود التي يتم تنفيذها بشكل غير أمثل.
تحليل الأداء (profiling) هو عملية جمع مقاييس حول أداء البرنامج: وقت تنفيذ الدوال، استهلاك الذاكرة، تكرار الاستدعاءات. بدونها، أي تحسين هو مجرد تخمين. في هذه المقالة، سنشرح كيفية تحليل أداء كود JavaScript في بيئة Node.js، وإيجاد "الاختناقات" وإزالتها.
ستتعرف على الأدوات المدمجة في V8، وChrome DevTools، والتقنيات العملية التي ستساعدك في جعل كودك أسرع.
1. تحليل الأداء المدمج في Node.js: العلامة --prof
أبسط طريقة لبدء تحليل الأداء هي استخدام العلامة --prof عند تشغيل تطبيق Node.js. تقوم هذه العلامة بتفعيل جمع إحصائيات V8، والتي يتم تحويلها لاحقًا إلى تقرير قابل للقراءة.
كيف يعمل
قم بتشغيل تطبيقك مع العلامة:
node --prof app.jsبعد انتهاء تشغيل التطبيق، سيظهر في المجلد ملف باسم isolate-0x...-v8.log. هذه بيانات خام. للحصول على تقرير، استخدم الأداة node --prof-process:
node --prof-process isolate-0x...-v8.log > profile.txtمثال: إيجاد دالة بطيئة
لنفترض أن لدينا هذا الكود:
function slowSort(arr) { return arr.sort((a, b) => a - b);}
function heavyComputation() { let sum = 0; for (let i = 0; i < 1e7; i++) { sum += Math.sqrt(i); } return sum;}
// تشغيلconst data = Array.from({ length: 10000 }, () => Math.random());slowSort(data);heavyComputation();بعد تحليل الأداء، سترى في التقرير شيئًا مثل:
[JavaScript]: ticks total nonlib name 120 60.0% 70.0% LazyCompile: *heavyComputation app.js:5 40 20.0% 25.0% LazyCompile: *slowSort app.js:1الرقم ticks يوضح عدد "النقرات" (العينات) التي تم تخصيصها لكل دالة. كلما زاد عدد النقرات، زاد وقت تنفيذ الدالة. في حالتنا، heavyComputation هو المرشح الرئيسي للتحسين.
2. Chrome DevTools: محلل الأداء البصري لـ Node.js
إذا كان التقرير النصي يبدو غير مريح، استخدم Chrome DevTools. هذه واجهة رسومية تعرض flamegraph (الرسم البياني اللهبي) — تصور لمكدس الاستدعاءات عبر الزمن.
الاتصال بعملية Node.js
قم بتشغيل التطبيق مع العلامة --inspect:
node --inspect app.jsافتح Chrome، وفي شريط العناوين اكتب chrome://inspect. اضغط على "Open dedicated DevTools for Node". ستنتقل إلى واجهة حيث يمكنك تسجيل ملفات الأداء.
تحليل عملي
لنأخذ مثالًا على تسرب الذاكرة:
const cache = [];
function addToCache(item) { cache.push(item);}
function processData() { for (let i = 0; i < 100000; i++) { addToCache({ id: i, data: new Array(1000).fill('x') }); }}
processData();سجل ملف الأداء عبر علامة التبويب "Memory" (التقط لقطة للكومة). سترى أن المصفوفة cache تستهلك مئات الميغابايت. سيظهر الرسم البياني اللهبي في علامة التبويب "Performance" أن الدالة addToCache تم استدعاؤها 100,000 مرة — وهذه هي نقطة الاختناق.
الحل: إما تقييد حجم ذاكرة التخزين المؤقت، أو استخدام هيكل بيانات يقوم تلقائيًا بحذف العناصر القديمة (مثل Map مع حد أقصى).
3. تحليل الأداء باستخدام وحدة perf_hooks
لقياس وقت تنفيذ أجزاء محددة من الكود بدقة، استخدم الوحدة المدمجة perf_hooks. هذا مشابه لـ
المدونات
توصيات الكتب
اقرأ أيضًا