¿Qué es la memoization?
la memorización (memoization) es una técnica de optimización que se utiliza principalmente para acelerar los programas de computadora mediante el almacenamiento de los resultados de llamadas a funciones en un caché intermedio.
Se almacena en caché el resultado de una función que ya fue ejecutada, si vuelves a llamarla con los mismos parámetros de entrada, en lugar de repetir todo el trabajo, se recupera de la memoria caché y devuelve el resultado de inmediato.
El flujo de una función memorizada es simple:
- Recibe los argumentos de entrada.
- Busca en el caché si ya se ha calculado un resultado para esos parámetros repetidos.
- Si existe en el caché, retorna el resultado guardado de inmediato.
- Si no existe, realiza la ejecución del código, guarda el resultado en el caché asociado a esos parámetros y luego lo retorna
TypeScript:
//Fibonacci para un valor de la secuencia
const fibonacci = (() => {
const cache = new Map();
return function fib(n: number): number {
//Consulta al caché
const cacheValor = cache.get(n);
if (cacheValor !== undefined) {
return cacheValor;
}
// Fibonacci estándar
if (n <= 2) {
return 1;
}
const resultado = fib(n - 1) + fib(n - 2);
cache.set(n, resultado);
return resultado;
};
})();
console.time("Primera vez (calculando)");
console.log(fibonacci(40)); // calcula y guarda en caché
console.timeEnd("Primera vez (calculando)");
console.time("Segunda vez (desde el caché)");
console.log(fibonacci(40)); // Instantáneo, lo saca del caché
console.timeEnd("Segunda vez (desde el caché)");
El resultado de la segunda vez será visiblemente más rápido:
12586269025
Primera vez (calculando): 0.67ms
12586269025
Segunda vez (desde el caché): 0.095ms
¿Cuándo debemos usar memoization?
La memorización se ve muy eficiente para mejorar el rendimiento, pero no es una solución para usarlo en todo. A continuación, te presentaré los escenarios en los cuales aplicarlos correctamente para que tu aplicación no se ve afectada o que pueda consumir toda la memoria RAM de tu estación de trabajo.
1. La función debe ser PURA
Vamos alegar que una función pura es aquella que, al recibir los mismos parámetros de entrada, siempre retorna exactamente el mismo valor de salida, independientemente del momento de su ejecución, su base de datos o el estado global.
- Memorizar: Funciones matemáticas complejas, procesamiento pesado de cadenas de texto o renderizado de datos estáticos.
- No memorizar: Funciones que realizan consultan a bases de datos, llamadas a APIs externas de forma asíncrona, funciones aleatorias similares a Math.random() o que devuelven tiempo o fecha.
2. Alto costo de procesamiento en relación a almacenamiento
La memorización es un intercambio de recursos de hardware, se utiliza memoria RAM adicional a cambio de tiempo de uso de la CPU.
- Memorizar: Si la función demanda alto procesamiento, pero sus resultados ocupan poco espacio en memoria.
- No memorizar: Si el cálculo es muy rápido pero el resultado es un objeto de gran volumen en megabytes, memorizar llenará tu memoria RAM con rapidez.
3. Parámetros repetidos
La memorización sirve si esperas que tu aplicación llame a la función con los mismos parámetros en múltiples ocasiones. Por el contrario, si cada llamada se realiza con parámetros completamente únicos que nunca se repetirán, guardarlo en caché solo servirá para consumir memoria de forma inútil.
CONCLUSIÓN
La memorización es uno de los conceptos de optimización más prácticos y directos en el desarrollo de software. Esta técnica demuestra que la manera más efectiva de acelerar un proceso no consiste en ejecutarlo a mayor velocidad, sino en evitar procesarlo más de una vez. Para implementarla, es fundamental evaluar el balance entre el uso del procesador y la memoria RAM, asegurar que las funciones cumplan con el criterios de pureza, para así evitar la persistencia de datos inconsistentes u obsoletos en la aplicación.
- Debes estar logueado para realizar comentarios