محتويات الدورة

JavaScript / متقدم: الجدولة والواجهات الموثوقة / الدرس 15

ملكية الذاكرة والأداء المستند إلى الأدلة

افهم الكائنات المحتفظ بها والمخابئ المحدودة والعمل الخوارزمي وقياسات المتصفح. حسّن البحث دون اختلاق توقيت أو الاعتماد على مواعيد جمع الذاكرة.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تتبع قابلية الوصول وتحرير المراجع المملوكة.
  • تحديد المخابئ وتجنب الاحتفاظ العرضي.
  • مقارنة الخوارزميات والقياسات بنطاق صريح.

لا يزيل الجمع التلقائي كائنات يمكن الوصول إليها

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

يحتاج المخبأ حدوداً وإبطالاً

يستبدل التخزين المؤقت العمل المتكرر بذاكرة والتزام اتساق. حدّد الحجم والمفتاح والإبطال وهل القيم متغيرة مشتركة. يطبق المثال إخلاء بترتيب الإدراج؛ فيزيل إدخال ثالث أقدم مفتاح. ليس LRU لأن القراءة لا تجدد الموضع. تمنع تسمية السياسة تحول اختصار تعليمي لضمان فعلي غير مقصود. راعِ التحميل المرفوض والقيم القديمة حتى لا تبقى الأخطاء أو الصلاحيات المتقادمة للأبد.

javascript مخبأ محدود بترتيب الإدراج
const cache = new Map();
function remember(key, value) {
  cache.set(key, value);
  if (cache.size > 2) cache.delete(cache.keys().next().value);
}
remember("A", 1); remember("B", 2); remember("C", 3);
console.log([...cache.keys()].join(","), cache.size);
الناتج المتوقع
B,C 2

تخلى A عند الإدراج الثالث دون ادعاء توقيت أو جمع ذاكرة.

عدّ العمل قبل ادعاء السرعة

يمسح البحث الخطي السجلات لكل معرف. قد يقلل بناء فهرس مرة عمل البحث مع كلفة ذاكرة واتساق تحديث. يعد المثال المقارنات ويتحقق من تطابق النتائج عبر Map، ولا يقيس الزمن أو يثبت تعقيد محرك معين. قد لا تستفيد البيانات الصغيرة زمنياً لأن بناء الفهرس عمل إضافي. راعِ الحجم وعدد البحث والتحديث والذاكرة قبل بنية أعقد.

javascript دليل عمليات ونتائج متكافئة
const rows = [{ id: 1 }, { id: 2 }, { id: 3 }];
const wanted = [3, 1, 3];
let comparisons = 0;
const linear = wanted.map(id => rows.find(row => {
  comparisons++; return row.id === id;
}));
const index = new Map(rows.map(row => [row.id, row]));
const indexed = wanted.map(id => index.get(id));
console.log(comparisons);
console.log(linear.every((row, i) => row === indexed[i]));
الناتج المتوقع
7
true

تنتج سبع مقارنات من مسح ثلاثة وواحد وثلاثة، وتحفظ المقارنة هوية السجلات المطابقة.

قياس فرضية كاملة

استخدم واجهات Performance والمحلل لفرضية محددة: بناء العقد يطيل الترشيح أو تتراكم العروض بعد الفتح. وثّق الجهاز والبيانات والبناء والإحماء والتكرارات. افصل التنفيذ والتخطيط والرسم والشبكة وإكمال المستخدم. قد تسوء الرحلة رغم دالة أسرع إذا زاد DOM. احفظ فحوص الصحة؛ فتخطي التحقق أو الصفوف يجعل العيب سريعاً ظاهرياً. أبلغ عن التباين والنطاق لا رقماً مصطنعاً عاماً.

تشترك الاستجابة والذاكرة في قرارات الملكية

اجمع كتابات DOM المترابطة وتجنب تناوب قراءات التخطيط والكتابة إذا أمكن حساب أبسط. حدّ العمل المنتظر واترك بيانات العرض غير المطلوبة. تقلل الصفحات أو الافتراضية العقد الحية لكن يجب حفظ التركيز والدلالة وإمكان العثور. اختبر التركيب والإزالة متكررين وافحص استقرار الاحتفاظ. تحتاج اللقطات تفسيراً؛ فكبر الكومة لحظة لا يثبت تسرباً. أثبت مسار احتفاظ أو نمط نمو قبل الإصلاح.

الأخطاء الشائعة وإصلاحها

نمو المخبأ مع كل طلب فريد

لماذا يحدث؟
غياب سياسة حجم وعمر.
كيف تصلحه؟
إضافة حد وسياسة إبطال موثقة.
كيف تتجنب تكراره؟
اختبار مفاتيح مختلفة والقيم القديمة.

توقع جمع الذاكرة بحذف متغير

لماذا يحدث؟
إغفال الوصول عبر ملاك آخرين.
كيف تصلحه؟
تحديد مسارات الاحتفاظ وتحرير التسجيلات والمراجع.
كيف تتجنب تكراره؟
مراجعة الإعداد والتحرير كعمر واحد.

تعميم توقيت صغير

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

اختبر فهمك

1. لماذا ليس المخبأ في المثال LRU؟

اعرض الحل المشروح

يتبع الإخلاء الإدراج ولا تحدثه القراءة. يجب أن يتتبع LRU حداثة الاستخدام عمداً مثلاً بتحريك المفتاح في بنية مملوكة. اختبر تجديد القراءة والاستبدال قبل هذا الادعاء.

2. كبرت لقطة الكومة بعد إغلاق حوار واحد. هل تثبت تسرباً؟

اعرض الحل المشروح

لا؛ يتغير الجمع والتخصيص الآخر. كرر الفتح والإغلاق وافحص مسارات الاحتفاظ والتنظيف وحدد نمو الكائنات بلا مالك مشروع. أصلح العمر بالدليل بدلاً من فرض الجمع سياسة للتطبيق.

أهم ما تعلمته

  • حدّ الحالة المحتفظ بها وحدد مالكها.
  • قس نتائج مستخدم صحيحة قبل ادعاءات الأداء.

المراجع الرسمية