Понимание мемоизации.
Одной из наиболее важных концепций программирования является «запоминание».
Сегодня мы попытаемся понять концепцию и то, почему она высоко оценивается как один из наиболее оптимизированных способов техники исполнения.
Запоминание – это метод оптимизации, используемый в основном для ускорения компьютерных программ путем сохранения результатов ресурсоемких вызовов функций и возврата кэшированного результата при повторении тех же входных данных.
Мемоизация простыми словами — это запоминание или сохранение в памяти. Запоминаемая функция, как правило, быстрее, потому что если функция вызывается впоследствии с теми же значениями, то вместо выполнения функции она будет извлекать результат из кеша.
Возьмем простую запоминаемую функцию.
// a simple function to add something const add = (n) => (n + 5); add(9); // a simple memoized function to add something const memoizedAdd = () => { let cache = {}; return (n) => { if (n in cache) { console.log('Fetching from cache..'); return cache[n]; } else { console.log('Calculating result..'); let result = n + 5; cache[n] = result; return result; } } }
// returned function from memoizedAdd const newAdd = memoizedAdd(); console.log(newAdd(9)); // calculated console.log(newAdd(9)); // cached
Некоторые ключевые выводы из запомненной выше функции.
memoizedAdd
возвращаетfunction
, который вызывается позже. Это возможно, потому что в JavaScript функции являются объектами первого класса, что позволяет нам использовать их как HOF и возвращать другую функцию.cache
может запомнить свои значения, так как возвращаемая функция имеет "замыкание" над ним.- Очень важно, чтобы запоминаемая функция была чистой. Чистая функция будет возвращать один и тот же результат для определенного ввода независимо от того, сколько раз она вызывается, что заставляет
cache
работать так, как ожидалось.
Попробуем реализовать собственный метод запоминания.
// a simple memoize function. It takes a function as an argument. const memoize = (fn) => { let cache = {}; return (...args) => { let n = args[0]; if (n in cache) { console.log('Fetching from the cache...'); return cache[n]; } else { let result = fn(n); cache[n] = result; console.log('Calculating the result...'); return result; } } } const add = (n) => (n + 10); console.log('Add call', add(3)); const memoizedAdd = memoize(add); console.log(memoizedAdd(3)); // calculated console.log(memoizedAdd(3)); // cache
Этот метод отлично работает для простой функции и может быть изменен в соответствии с потребностями реализации.
Основная идея этой статьи — дать представление о методе мемоизации, который можно использовать для улучшения методов оптимизации.
Мемоизация — это то же самое, что кэширование?
Да вроде. Мемоизация на самом деле является особым типом кэширования. В то время как кеширование может относиться к любому методу хранения (например, кешированию HTTP) для будущего использования, мемоизация конкретно включает кэширование возвращаемых значений function
.
Мемоизация лучше всего подходит для тяжелых вычислительных функций, которые могут значительно повысить производительность.
Я надеюсь, что эта статья могла дать лучшее представление о мемоизации.
Удачного кодирования. Продолжайте учиться и делиться. Продолжайте исследовать.