Запоминание. Даже текстовый редактор 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!
Мемоизация и кэширование — два понятия, которые могут сбить с толку так же, как попытка заказать чашку кофе в кафе за границей. Мемоизация похожа на бармена, который помнит ваш любимый напиток и готовит его для вас еще до того, как вы спросите, а кэширование похоже на секретную комнату для хранения, где вы храните все свои ценные данные в безопасности и доступны. Итак, наденьте шляпы программирования и давайте вместе исследуем эти две мистические… я имею в виду технические техники.
- Цель. Мемоизация кэширует результаты определенной функции для оптимизации ее производительности, а при кэшировании часто используемые данные сохраняются во всем приложении.
- Реализация. Мемоизацию можно реализовать с помощью простой оболочки функций, а для кэширования могут потребоваться сложные структуры данных и алгоритмы.
- Время жизни: результаты Memoized обычно хранятся в памяти в течение одного вызова функции, тогда как кэшированные данные могут храниться в течение более длительного периода времени и могут нуждаться в периодическом обновлении или признании недействительными.
- Область действия. Мемоизация обычно используется в рамках одной функции или модуля, а кэширование может применяться в нескольких функциях или модулях.
- Аннулирование кеша: Memoization не предлагает автоматическое аннулирование кеша, в то время как кеширование может быть аннулировано вручную или автоматически на основе определенных критериев.
- Автоматическое кэширование: мемоизация требует явного кэширования, в то время как кэширование может быть автоматическим и выполняться используемым языком или платформой.
Понимание различий между мемоизацией и кэшированием важно для любого разработчика, стремящегося повысить скорость своего кода. Вы можете значительно повысить скорость и эффективность своих приложений, выбрав правильную стратегию для правильного сценария.
Вот вам шутка!!Почему мемоизированная функция разошлась с алгоритмом кеширования?Потому что поняла, что просто использует его для своего кеша!😂😂
Рекомендации по использованию мемоизации в JavaScript
В предыдущем разделе мы поняли, что такое мемоизация и как она используется нами в реальных приложениях. В этом разделе мы рассмотрим некоторые рекомендации по эффективному использованию мемоизации в вашем коде. Некоторые из них:
- Запоминайте только чистые функции, которые всегда возвращают один и тот же результат при одном и том же входе.
- Проверьте производительность ваших запомненных функций по сравнению с исходной версией, чтобы убедиться, что оптимизация того стоит.
- Помните об использовании памяти и очищайте объект кеша, если он становится слишком большим.
- Избегайте запоминания функций с побочными эффектами, таких как функции, которые изменяют внешнее состояние или выполняют операции ввода-вывода.
- Документируйте запомненные функции и объекты кеша, чтобы другим разработчикам было проще понять ваш код и работать с ним.
- Избегайте запоминания функций с побочными эффектами, таких как функции, которые изменяют внешнее состояние или выполняют операции ввода-вывода.
Запоминание в ReactJS
Мемоизация — это мощный метод повышения производительности функций JavaScript за счет кэширования их результатов. В React мемоизация используется двумя основными способами: с помощью React.memo(теперь memo), который запоминает результат метода рендеринга компонента, и useMemo хук, который запоминает результат функции. Используя мемоизацию в React, вы можете избежать ненужных повторных рендерингов и повторных вычислений, а также создавать более быстрые и отзывчивые пользовательские интерфейсы.
Запоминание в нескольких других местах
Мемоизация — это метод, обычно используемый в динамическом программировании для оптимизации рекурсивных алгоритмов, в которых есть перекрывающиеся подзадачи. В динамическом программировании вы решаете проблему, разбивая ее на более мелкие подзадачи, а затем решаете каждую подзадачу только один раз и сохраняете решение в таблице для будущего использования. Здесь на помощь приходит мемоизация. Используя мемоизацию, вы можете сохранять решения уже решенных подзадач и извлекать их при необходимости без необходимости каждый раз пересчитывать их.
Мемоизация обычно используется в функциональных языках программирования, таких как Haskell, где она является встроенной функцией. В функциональном программировании функции чисты и не имеют побочных эффектов, что делает их идеальными для запоминания.
Заключение
В этом блоге мы изучили основы мемоизации в JavaScript и рассмотрели, как ее можно реализовать на простых примерах. Мы также обсудили лучшие практики использования мемоизации в вашем коде и выделили некоторые распространенные ловушки, которых следует избегать. В целом мемоизация — это мощная техника, которая может помочь вам создавать более быстрые и эффективные приложения, но важно использовать ее правильно и с осторожностью. Следуя рекомендациям, изложенным в этом блоге, вы можете воспользоваться преимуществами мемоизации для оптимизации кода и повышения производительности приложения.
Вы можете узнать больше о мемоизации из следующих источников:
- Что такое мемоизация? Как и когда запоминать в JavaScript и React от freecodecamp.org
- Изучите JavaScript, внедрив мемоизацию,Эдгар Абгарян
Любые предложения или исправления всегда приветствуются!!🦚
Спасибо!!