مقدمة إلى 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!