Memoization في JavaScript

مقدمة إلى memoization في JavaScript

Memoization هي إحدى التقنيات التي تتيح لك تسريع تطبيقاتك بشكل كبير.

إنها ليست تقنية فريدة لجافا سكريبت ، على الرغم من أنني قمت بتمييز هذا المنشور باسم "JavaScript" لأنني سأقدم بعض أمثلة JS.

Memoization هي عملية تخزين نتيجة استدعاء دالة بعد تشغيلها ، في الوظيفة نفسها. في المرة التالية التي نستدعي فيها الوظيفة ، بدلاً من تنفيذ التنفيذ "العادي" مرة أخرى ، فإنها ترجع لنا النتيجة المخزنة.

إنهالتخزين المؤقت للوظائف.

لماذا هذا مفيد؟

افترض أن وظيفتنا تستغرق ثانية واحدة للتشغيل ، بينما يتيح لنا التخزين المؤقت تسريع العملية إلى 2 مللي ثانية. هناك مكاسب واضحة هنا.

يبدو رائعًا. أين الفائدة؟

يعمل Memoization إذا كانت نتيجة استدعاء دالة لها نفس مجموعة الوسائط تؤدي إلى نفس الإخراج. بمعنى آخر ، يجب أن تكون الوظيفةنقي. وإلا فلن يكون تخزين النتيجة منطقيًا.

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

لنقم بإنشاء مثال واحد:

// Calculate the factorial of num
const fact = num => {
  if (!fact.cache) {
    fact.cache = {}
  }
  if (fact.cache[num] !== undefined) {
    console.log(num + ' cached')
    return fact.cache[num];
  } else {
    console.log(num + ' not cached')
  }
  fact.cache[num] = num === 0 ? 1 : num * fact(num - 1)
  return fact.cache[num]
}

حساب مضروب الرقم. المرة الأولىfact()يتم تشغيله ، فإنه ينشئ ملفcacheالكائن على الوظيفة نفسها ، حيث يتم تخزين نتيجة حسابها.

عند كل مكالمة ، إذا لم نجد نتيجة الرقم فيcacheكائن ، نقوم بالحساب. وإلا فإننا فقط نعيد ذلك.

حاول تشغيله. لقد صنعت Codepen لتسهيل الاختبار ، والذي يستخدمdocument.write()للطباعة إلى صفحة HTML (استخدمتها لأول مرةdocument.write()في العصور ، ولكن هذه المرة كانت مفيدة).

انظر القلمعامل التذكر المثالبقلم فلافيو كوبس (تضمين التغريدة) تشغيلكود.

Tech Wiki Online!