Понимание мемоизации.

Одной из наиболее важных концепций программирования является «запоминание».

Сегодня мы попытаемся понять концепцию и то, почему она высоко оценивается как один из наиболее оптимизированных способов техники исполнения.

Запоминание – это метод оптимизации, используемый в основном для ускорения компьютерных программ путем сохранения результатов ресурсоемких вызовов функций и возврата кэшированного результата при повторении тех же входных данных.

Мемоизация простыми словами — это запоминание или сохранение в памяти. Запоминаемая функция, как правило, быстрее, потому что если функция вызывается впоследствии с теми же значениями, то вместо выполнения функции она будет извлекать результат из кеша.

Возьмем простую запоминаемую функцию.

// 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.

Мемоизация лучше всего подходит для тяжелых вычислительных функций, которые могут значительно повысить производительность.

Я надеюсь, что эта статья могла дать лучшее представление о мемоизации.

Удачного кодирования. Продолжайте учиться и делиться. Продолжайте исследовать.