tgoop.com/AsForJavaScript/894
Last Update:
На канале Бабіча сегодня был пост про Північ памʼятає! А от твоєму коду — необовʼязково.
где речь шла про мемоизацию.
От которого у меня возгорелась жопа, которая требовала уточнений
Ееее бейба да ты вся горишь,
я твой огнетушитель
пыщь пыщь, пышь пышь.
По сути
Мемоизация - это термин, который пришел к нам в этом виде из FP программирования.
Другие, тоже самое знают под термином кеширование - то есть процесс, когда сохранить результат работы какой то алгоритмической части будет дешевле, чем повторно выполнить эту алгоритмическую часть.
Например, запрос ресурса у удаленного сервера может нам стоить 300мс. То есть каждый повторный запрос, это еще 300мс ожидания. В то же время, если мы сохраним в кеше результат работы запроса и будем возвращать его - это 1мс. Экономия в 300 раз.
Ура кешированию и мемоизации.
Рахсодимся?
Нет. Во всем этом, важен сам факт сравнения - стоит ли процесс извлечения данных из кеша того? Может проще запросить их снова?
Первое то, что кеш может приносить пользу, понятно всем.
А вот второе - а когда это начинает происходить, и является свяэщенным граалем мемоизации.
Что говорится у Бабіча в посте:
Если у Вас СЛОЖНЫЕ вычисления - используйте кеширование/мемоизацию
Если у Вас существенные вычисления и повторяемость высокая - используйте кеширование/мемоизацию
Все классно, только что такое СЛОЖНЫЕ вычисления или высокая повторяемость?
Это все подобно формулировкам, сделайте хорошо когда можно сделать хорошо и никогда не делайте плохо когда плохо.
Все это идет наперевес с использованием useMemo в реакт. Как пример того, насколько бездумно его могут использовать. И снова критерий - не используйте useMemo когда это плохо. И используйте когда хорошо.
Чтобы дать хоть какую-то обьективную оценку, что хорошо, а что плохо - я лезу в код React для useMemo. И офегеваю от того сколько потребляет ресурсов эта возможность. Первое что напрашивается - никогда не используйте useMemo.
Я лезу в документацию к React с целью выяснить, что они рекомендуют:
useMemo is a React Hook that lets you cache the result of a calculation between re-renders.
и далее - чтобы принимать решение о использовании useMemo, используйте профайлинг вашего кода.
Вы знаете сколько требует ресурсов ре рендерс?
Dert Wider. Титры.
Краткая памятка что делать:
1) Если Вы понятия не имеете о том, почему вам нужно кеширование/мемоизация - не используйте вообще ничего.
2) Чтобы узнать нужно ли оно Вам - профилируйте ваш код.
3) Найдя слабое место - используйте для начала специфическое решение, гвозядми прибитое к вашему коду, который вызывает проблемы.
4) Снова профилируйте.
5) Получили положительный отклик. Попробуйте внешнее решение подобное useMemo
6) Снова профилируйте
Список ситуаций, которые должны вызывать у вас жгучее желание в одном месте попрофилировать ваш код:
1) Вызов внешних API особенно тех, которые напрямую связаны с IO: сеть, диск, формирование отображения
2) Одни и те-же математические вычисления, которые повторяются больше 5 000 раз.
3) Большая вложенность используемых методов
4) Вызов внутреннего метода, который приводит к одному из выше обозначенных поведений
На что следует обратить внимание:
любые внешние инструменты, подобные useMemo в реакт, сами по себе потребляют ресурсы. В случае useMemo - огромные.
Вы можете легко оказаться в ситуации, когда решение для кеширования, написанное вами на коленке для вашего кода, будет работать на порядок быстрее внешнего, подобного useMemo.
Если у Вас еще нет достаточного опыта в подобных вопросах то постарайтесь избавиться от любых стереотипов в голове. Вот вам пример
function doAdd (a, b) {
return a+b
}
Вы точно знаете, что a и b всегда будут числами. Может ли тут потребоваться мемоизация? Даже если это повторяется 100500 раз?
Ответ: Нет, до тех пор пока ваши числа Типа Number.
И второй ответ: Все может сильно измениться когда у вас числа типа BigInt.
BY As For JS
Share with your friend now:
tgoop.com/AsForJavaScript/894