با تشکر از Memoize – انجمن DEV

Summarize this content to 400 words in Persian Lang
کسانی از شما که مرا می شناسید می دانید که من یک خاطره تلخ مطلق دارم. هر چیزی که کمتر از دیالوگ مونتی پایتون و لیست آهنگ از یک گروه موسیقی آلت راک دهه 90 باشد و من به حق من مردهام. با این حال، خوشبختانه برای ما، کامپیوترها در به خاطر سپردن چیزها بسیار توانمندتر هستند.
مفهوم
تکنیکی که ما امروز به آن نگاه می کنیم، حافظه نویسی نامیده می شود. بیایید با بحث در مورد توابع خالص شروع کنیم. ایده پشت یک تابع خالص این است که مهم نیست چه ورودی به آن می دهید، همیشه همان خروجی را ارائه می دهد. حال در نظر بگیرید که آیا یک عملکرد فشرده فرآیند دارید یا عملکردی که نیاز به سربار زیادی دارد. اگر از قبل نتیجه اجرای تابع را با ارائه مجموعه خاصی از پارامترها می دانید، چرا از منابع خود برای اجرای مجدد آن استفاده کنید. حافظه به ما اجازه می دهد تا نتیجه اجرای قبلی یک تابع را با استفاده از پارامترهای آن تابع به عنوان کلید ذخیره کنیم. قطعه کد زیر نشان می دهد که یک تابع ذخیره شده چگونه ممکن است به نظر برسد:
اعدام
const memoize = {};
const getResult = async (n1, n2) => {
const key = `${n1}_${n2}`;
if (!memoize[key]) {
memoize[key] = await resourceIntensiveFunction(n1, n2);
}
return memoize[key];
};
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
بیایید نگاهی به کد بیندازیم. ما با یک شی به نام memoize شروع می کنیم که پارامترهای ما و نتایج را به عنوان مجموعه مقادیر کلیدی ذخیره می کند. بعد ما تابع خود را فراخوانی می کنیم getResult که دو پارامتر می گیرد: n1 و n2. برای سادگی این موضوع، فرض کنیم که نظم مهم است. ما قصد داریم با استفاده از الحاق دو پارامتر یک کلید متغیر ایجاد کنیم.
اکنون باید بررسی کنیم که آیا شیء memoize حاوی مقداری برای آن کلید است یا خیر. بررسی می کنیم و اگر این کار را نکرد، چاره ای جز اجرای تابع فشرده منابع نداریم. اگر تابع را اجرا کنیم، باید نتایج را نیز برای اجرای بعدی در شیء حافظه ذخیره کنیم. به این ترتیب دفعه بعد که این تابع را برای همین پارامترها اجرا کنید، نتیجه را در شی پیدا می کند و تابع منبع فشرده را رد می کند.
زمانی که پرس و جو قبلا اجرا شده است، به خاطر بسپارید
زمانی که پرس و جو قبلا اجرا نشده است، به خاطر بسپارید
مزایا
این می تواند در تعدادی از سناریوها مفید باشد. به عنوان مثال، اگر شما یک سری محاسبات طولانی داشته باشید که زمان زیادی را صرف می کند و این منابع را بهینه می کند، بهینه سازی ارزشمندی است. همچنین اگر چیزی دارید که به توان عملیاتی شبکه بالا یا فضای دیسک موقت زیادی نیاز دارد، می تواند ارزشمند باشد. برای هر یک از این سناریوها مزیت دو مورد است: نیاز به اجرای توابعی را که قبلاً اجرا شده اند را حذف می کند و منابع را برای آنهایی که باید محاسبه شوند آزاد می کند زیرا آنها برای منابع با توابعی که قبلاً نقشه برداری شده اند رقابت نمی کنند. .
چالش ها
شرایطی وجود دارد که ممکن است این رویکرد درست نباشد، بنابراین همیشه از این الگو استفاده نکنید. اگر تابع شما یک تابع خالص نیست و بر اساس عوامل خارجی تغییر میکند، نمیخواهید از این رویکرد استفاده کنید، زیرا همیشه مقادیر را از اولین اجرای بدون در نظر گرفتن سایر متغیرها به شما میدهد. همچنین اگر برنامه به ندرت عملکرد را با مجموعه ای از پارامترها اجرا می کند، نمی خواهید از این استفاده کنید. در این صورت شما یک ساختار داده ای بزرگتر خواهید داشت که به ندرت مورد استفاده قرار می گیرد.
این تقریباً برای حفظ کردن است. این یک الگوی بسیار ساده با نامی بسیار ترسناک است. برنامه های کاربردی زیادی برای آن وجود دارد و امیدواریم این به شما ایده بهتری از آنچه در زیر کاپوت اتفاق می افتد می دهد. حالا اگر ببخشید، باید بروم یادم بیاید که امروز عصر قرار بود چه کار کنم.
کد منبع موجود در GitHub
کسانی از شما که مرا می شناسید می دانید که من یک خاطره تلخ مطلق دارم. هر چیزی که کمتر از دیالوگ مونتی پایتون و لیست آهنگ از یک گروه موسیقی آلت راک دهه 90 باشد و من به حق من مردهام. با این حال، خوشبختانه برای ما، کامپیوترها در به خاطر سپردن چیزها بسیار توانمندتر هستند.
مفهوم
تکنیکی که ما امروز به آن نگاه می کنیم، حافظه نویسی نامیده می شود. بیایید با بحث در مورد توابع خالص شروع کنیم. ایده پشت یک تابع خالص این است که مهم نیست چه ورودی به آن می دهید، همیشه همان خروجی را ارائه می دهد. حال در نظر بگیرید که آیا یک عملکرد فشرده فرآیند دارید یا عملکردی که نیاز به سربار زیادی دارد. اگر از قبل نتیجه اجرای تابع را با ارائه مجموعه خاصی از پارامترها می دانید، چرا از منابع خود برای اجرای مجدد آن استفاده کنید. حافظه به ما اجازه می دهد تا نتیجه اجرای قبلی یک تابع را با استفاده از پارامترهای آن تابع به عنوان کلید ذخیره کنیم. قطعه کد زیر نشان می دهد که یک تابع ذخیره شده چگونه ممکن است به نظر برسد:
اعدام
const memoize = {};
const getResult = async (n1, n2) => {
const key = `${n1}_${n2}`;
if (!memoize[key]) {
memoize[key] = await resourceIntensiveFunction(n1, n2);
}
return memoize[key];
};
بیایید نگاهی به کد بیندازیم. ما با یک شی به نام memoize شروع می کنیم که پارامترهای ما و نتایج را به عنوان مجموعه مقادیر کلیدی ذخیره می کند. بعد ما تابع خود را فراخوانی می کنیم getResult
که دو پارامتر می گیرد: n1
و n2
. برای سادگی این موضوع، فرض کنیم که نظم مهم است. ما قصد داریم با استفاده از الحاق دو پارامتر یک کلید متغیر ایجاد کنیم.
اکنون باید بررسی کنیم که آیا شیء memoize حاوی مقداری برای آن کلید است یا خیر. بررسی می کنیم و اگر این کار را نکرد، چاره ای جز اجرای تابع فشرده منابع نداریم. اگر تابع را اجرا کنیم، باید نتایج را نیز برای اجرای بعدی در شیء حافظه ذخیره کنیم. به این ترتیب دفعه بعد که این تابع را برای همین پارامترها اجرا کنید، نتیجه را در شی پیدا می کند و تابع منبع فشرده را رد می کند.
زمانی که پرس و جو قبلا اجرا شده است، به خاطر بسپارید
زمانی که پرس و جو قبلا اجرا نشده است، به خاطر بسپارید
مزایا
این می تواند در تعدادی از سناریوها مفید باشد. به عنوان مثال، اگر شما یک سری محاسبات طولانی داشته باشید که زمان زیادی را صرف می کند و این منابع را بهینه می کند، بهینه سازی ارزشمندی است. همچنین اگر چیزی دارید که به توان عملیاتی شبکه بالا یا فضای دیسک موقت زیادی نیاز دارد، می تواند ارزشمند باشد. برای هر یک از این سناریوها مزیت دو مورد است: نیاز به اجرای توابعی را که قبلاً اجرا شده اند را حذف می کند و منابع را برای آنهایی که باید محاسبه شوند آزاد می کند زیرا آنها برای منابع با توابعی که قبلاً نقشه برداری شده اند رقابت نمی کنند. .
چالش ها
شرایطی وجود دارد که ممکن است این رویکرد درست نباشد، بنابراین همیشه از این الگو استفاده نکنید. اگر تابع شما یک تابع خالص نیست و بر اساس عوامل خارجی تغییر میکند، نمیخواهید از این رویکرد استفاده کنید، زیرا همیشه مقادیر را از اولین اجرای بدون در نظر گرفتن سایر متغیرها به شما میدهد. همچنین اگر برنامه به ندرت عملکرد را با مجموعه ای از پارامترها اجرا می کند، نمی خواهید از این استفاده کنید. در این صورت شما یک ساختار داده ای بزرگتر خواهید داشت که به ندرت مورد استفاده قرار می گیرد.
این تقریباً برای حفظ کردن است. این یک الگوی بسیار ساده با نامی بسیار ترسناک است. برنامه های کاربردی زیادی برای آن وجود دارد و امیدواریم این به شما ایده بهتری از آنچه در زیر کاپوت اتفاق می افتد می دهد. حالا اگر ببخشید، باید بروم یادم بیاید که امروز عصر قرار بود چه کار کنم.
کد منبع موجود در GitHub