Запоминание. Даже текстовый редактор Medium считает, что слово неверно. Если вы видите это слово впервые, вы можете спутать его с «заучиванием», но да, в нем нет буквы «р». Мемоизация — это причудливый способ сказать «запоминать что-то, чтобы вам не пришлось делать это снова». А кому не нравится хороший ярлык? В этой статье мы узнаем о том, где использовать, как использовать и когда использовать запоминание вместе с некоторыми фрагментами кода, чтобы понять, что мы изучаем. Начинаем🚀🚀!!

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

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

Чтобы лучше понять это, давайте возьмем очень распространенный пример ряд Фибоначчи:

let cache = {};

function fibonacci(num) {
  if (num <= 1) {
    return num;
  } else if (cache[num]) {
    return cache[num];
  } else {
    cache[num] = fibonacci(num - 1) + fibonacci(num - 2);
    return cache[num];
  }
}

В этом случае функция fibonacci() рекурсивно генерирует числа Фибоначчи. Однако рекурсивный характер функции означает, что она может быстро стать очень медленной при больших значениях num. Используя мемоизацию, мы можем кэшировать результаты функции и избежать избыточных . Здесь мы используем объект с именем cache для хранения результатов функции. Если функция вызывается с номером, который уже существует в кэше, мы можем вернуть кэшированный результат вместо его пересчета.

Мы можем увидеть реальное приложение мемоизации в javascript, где мы собираемся сделать запрос на выборку API,

let cache = {};

function getDataFromAPI(endpoint) {
  if (cache[endpoint]) {
    return Promise.resolve(cache[endpoint]);
  } else {
    return fetch(endpoint)
      .then(response => response.json())
      .then(data => {
        cache[endpoint] = data;
        return data;
      });
  }
}

В этом примере мы используем мемоизацию для оптимизации функции, которая отправляет запросы к API. Функция getDataFromAPI() сначала проверяет, не кэширован ли уже результат для данного endpoint. Если это так, он немедленно возвращает разрешенное обещание с кэшированными данными. Если это не так, он делает запрос к API с помощью метода fetch() и сохраняет результат в кеше для использования в будущем.

Кэширование против мемоизации: битва за трон Cache-ius!

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

  1. Цель. Мемоизация кэширует результаты определенной функции для оптимизации ее производительности, а при кэшировании часто используемые данные сохраняются во всем приложении.
  2. Реализация. Мемоизацию можно реализовать с помощью простой оболочки функций, а для кэширования могут потребоваться сложные структуры данных и алгоритмы.
  3. Время жизни: результаты Memoized обычно хранятся в памяти в течение одного вызова функции, тогда как кэшированные данные могут храниться в течение более длительного периода времени и могут нуждаться в периодическом обновлении или признании недействительными.
  4. Область действия. Мемоизация обычно используется в рамках одной функции или модуля, а кэширование может применяться в нескольких функциях или модулях.
  5. Аннулирование кеша: Memoization не предлагает автоматическое аннулирование кеша, в то время как кеширование может быть аннулировано вручную или автоматически на основе определенных критериев.
  6. Автоматическое кэширование: мемоизация требует явного кэширования, в то время как кэширование может быть автоматическим и выполняться используемым языком или платформой.

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

Вот вам шутка!!Почему мемоизированная функция разошлась с алгоритмом кеширования?Потому что поняла, что просто использует его для своего кеша!😂😂

Рекомендации по использованию мемоизации в JavaScript

В предыдущем разделе мы поняли, что такое мемоизация и как она используется нами в реальных приложениях. В этом разделе мы рассмотрим некоторые рекомендации по эффективному использованию мемоизации в вашем коде. Некоторые из них:

  • Запоминайте только чистые функции, которые всегда возвращают один и тот же результат при одном и том же входе.
  • Проверьте производительность ваших запомненных функций по сравнению с исходной версией, чтобы убедиться, что оптимизация того стоит.
  • Помните об использовании памяти и очищайте объект кеша, если он становится слишком большим.
  • Избегайте запоминания функций с побочными эффектами, таких как функции, которые изменяют внешнее состояние или выполняют операции ввода-вывода.
  • Документируйте запомненные функции и объекты кеша, чтобы другим разработчикам было проще понять ваш код и работать с ним.
  • Избегайте запоминания функций с побочными эффектами, таких как функции, которые изменяют внешнее состояние или выполняют операции ввода-вывода.

Запоминание в ReactJS

Мемоизация — это мощный метод повышения производительности функций JavaScript за счет кэширования их результатов. В React мемоизация используется двумя основными способами: с помощью React.memo(теперь memo), который запоминает результат метода рендеринга компонента, и useMemo хук, который запоминает результат функции. Используя мемоизацию в React, вы можете избежать ненужных повторных рендерингов и повторных вычислений, а также создавать более быстрые и отзывчивые пользовательские интерфейсы.

Запоминание в нескольких других местах

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

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

Заключение

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

Вы можете узнать больше о мемоизации из следующих источников:

Любые предложения или исправления всегда приветствуются!!🦚

Спасибо!!