Sobes.tech
Назад к вопросам
Middle+
2

function memoize(fn, options = {}) { const { maxSize = 1000, keyOf = (...a) => JSON.stringify(a), lruTouch = true, } = options; let hits = 0; let misses = 0; const cache = new Map(); const getKey = (...args) => keyOf(...args); const wrapped = (...args) => { // пишем код тут return fn(...args); }; // и тут return wrapped; }

Компании, где спрашивали
Basis

Ответ от нейросети

sobes.tech AI

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

Ниже пример реализации с учётом параметров maxSize, keyOf и lruTouch:

function memoize(fn, options = {}) {
  const {
    maxSize = 1000,
    keyOf = (...a) => JSON.stringify(a),
    lruTouch = true,
  } = options;

  let hits = 0;
  let misses = 0;

  const cache = new Map();
  const getKey = (...args) => keyOf(...args);

  const wrapped = (...args) => {
    const key = getKey(...args);
    if (cache.has(key)) {
      hits++;
      const value = cache.get(key);
      if (lruTouch) {
        // Обновляем порядок для LRU: удаляем и заново вставляем
        cache.delete(key);
        cache.set(key, value);
      }
      return value;
    }

    misses++;
    const result = fn(...args);
    cache.set(key, result);

    if (cache.size > maxSize) {
      // Удаляем самый старый элемент (первый вставленный)
      const firstKey = cache.keys().next().value;
      cache.delete(firstKey);
    }

    return result;
  };

  // Можно добавить методы для получения статистики
  wrapped.cache = cache;
  wrapped.getHits = () => hits;
  wrapped.getMisses = () => misses;

  return wrapped;
}

В этом коде:

  • cache — Map, где ключ — результат keyOf от аргументов, значение — результат функции.
  • При попадании в кеш (cache.has(key)) возвращаем сохранённое значение и обновляем порядок, если включён LRU.
  • При добавлении нового элемента, если размер превышает maxSize, удаляем самый старый.
  • Считаем количество попаданий и промахов для статистики.