Memoización cronometrada

Ciertas operaciones son computacionalmente costosas, pero debido a que sus resultados pueden cambiar con el tiempo o debido a influencias externas, no se prestan a la memorización típica; tome por ejemplo getElementsByClassName . Aquí hay una función de orden superior/decorador de memorización cronometrada de JavaScript que hice para ayudar con estos casos, que acepta un argumento de caducidad opcional en milisegundos.

function memoize (functor, expiration) {
	var memo = {};
	return function () {
		var key = Array.prototype.join.call(arguments, "§");
		if (key in memo)
			return memo[key];
		if (expiration)
			setTimeout(function () {delete memo[key];}, expiration);
		return memo[key] = functor.apply(this, arguments);
	};
}

Este enfoque le permite convertir cualquier función en una función de memorización. Tenga en cuenta que los valores devueltos se memorizan para cada conjunto de argumentos. Sin embargo, debido a restricciones técnicas, solo es confiable cuando los argumentos son matrices o valores escalares, pero podría usar fácilmente, p. un toJSON método en lugar de join para serializar objetos como parte de la clave de caché (con algún costo adicional).

Puedes usar el código anterior así:

// Make a function which memoizes for 1000 milliseconds at a time
var fn = memoize(function () {
	Array(500000).join("."); // slow
	return true;
}, 1000);

…O omita el argumento de caducidad para memorizarlo de forma permanente.

Aquí hay un par de publicaciones más sobre memorización de JavaScript:

  • Memoización de JavaScript de una línea de Oliver Steele
  • Memoización en JavaScript por Keith Gaughan