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

Существует множество библиотек мемоизации JavaScript, и выбор правильной для вашего случая использования может существенно повлиять на производительность вашего приложения.

Одна из проблем заключается в том, как оценить и сравнить производительность вашего мемоизации — и это определенно не тривиальная задача. Мы рассмотрим, как провести значимый бенчмаркинг для самых разных вариантов использования. Мы углубились в это и в итоге написали собственный бенчмаркинг и библиотеку мемоизации под названием «sonic-memoize».

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

Мемоизация без ограничения размера кэша

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

Вы должны проверить на:

  • Сколько времени требуется для обработки новых вызовов функций, которых еще нет в кеше (и сохранения их для последующих вызовов)
  • Сколько времени требуется для чтения ранее вызванных вызовов функций из кеша
  • функции с одним параметром и с несколькими параметрами, а также с разными типами параметров

Вот результаты наших тестов для библиотек JavaScript без ограничения размера кеша:

Вы можете найти больше результатов тестирования и подробности о настройке здесь: https://github.com/Animus-Blue/memoization-benchmarking#benchmark-results

Мемоизация с ограничением размера кэша

Мемоизация может быть реализована с помощью стратегии кэширования LRU (наименее недавно использовавшейся). Это означает, что как только кеш заполнится, последний использованный элемент будет удален. Это ограничивает использование памяти и по-прежнему дает вам хорошие шансы на то, что необходимые вызовы функций будут кэшированы. Недостатком ограничения размера кэша LRU является то, что это может привести к снижению производительности (хотя и не очень значительному, если оно реализовано должным образом).

Вы должны проверить на:

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

Вот результаты наших тестов для библиотек JavaScript с ограничением размера кэша LRU:

Вы можете найти больше результатов тестирования и подробности о настройке здесь: https://github.com/Animus-Blue/memoization-benchmarking#benchmark-results

Если у вас есть какие-либо вопросы или вы просто хотите поговорить о разработке и оптимизации программного обеспечения, оставьте комментарий или свяжитесь с нами.

ЛинкедИн