TechLead
💾
Intermedio
11 min lectura

Memoización y caching

Reutiliza resultados para reducir cómputo repetido

Memoización y caching

La memoización guarda el resultado de funciones costosas para reutilizarlos con las mismas entradas. Es una técnica poderosa para mejorar rendimiento.

Memoización básica

function memoize(fn) {
  const cache = new Map();
  
  return function(...args) {
    const key = JSON.stringify(args);
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = fn(...args);
    cache.set(key, result);
    return result;
  };
}

// Example
const slowFib = n => n <= 1 ? n : slowFib(n - 1) + slowFib(n - 2);
const fastFib = memoize(slowFib);

fastFib(40); // Cached for subsequent calls

Cache con expiración (TTL)

function memoizeWithTTL(fn, ttl = 60000) {
  const cache = new Map();
  
  return function(...args) {
    const key = JSON.stringify(args);
    const now = Date.now();
    
    if (cache.has(key)) {
      const { value, timestamp } = cache.get(key);
      if (now - timestamp < ttl) {
        return value;
      }
    }
    
    const result = fn(...args);
    cache.set(key, { value: result, timestamp: now });
    return result;
  };
}

Memoización en React

// useMemo and useCallback
function MyComponent({ items }) {
  const filtered = useMemo(() => {
    return items.filter(item => item.active);
  }, [items]);
  
  const handleClick = useCallback(() => {
    console.log('Clicked');
  }, []);
  
  return ;
}

Cache de resultados async

// Simple async cache
const asyncCache = new Map();

async function fetchWithCache(url) {
  if (asyncCache.has(url)) {
    return asyncCache.get(url);
  }
  
  const promise = fetch(url).then(r => r.json());
  asyncCache.set(url, promise);
  
  return promise;
}

Buenas prácticas

  • Memoiza solo funciones puras y deterministas
  • Evita cachear entradas con alto cardinalidad si la memoria es limitada
  • Usa TTL para datos que cambian con el tiempo
  • Para React, usa useMemo y useCallback con dependencias correctas