Назад к вопросам
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, удаляем самый старый. - Считаем количество попаданий и промахов для статистики.