javascript 记忆 (函数缓存)

记忆是一种可以被用来避免重复昂贵的运算以加速程序的技术,先展示一个队斐波那契数列(Fibonacci Sequence)的实现,它用两个递归调用来计算给定输入的值。


function fibonacci(x) {
	if (x < 2) {
		return 1;
	}
	return fibonacci(x - 1) + fibonacci(x - 2);
}

斐波那契数列的计算是十分昂贵的,它迅速产生了太多的递归调用给浏览器来处理。同归把函数包裹在一个闭包中,我们可以手工技艺计算过的值以优化这个方法。


var fibonacci = (function (){
	var cache = {};
	
	function fibonacci(x) {
		if (x < 2) {
			return 1;
		}
		if (!cache [x]) {
			cache [x] = fibonacci(x - 1) + fibonacci(x - 2);
		}
		
		return cache [x];
		//return fibonacci(x - 1) + fibonacci(x - 2);
	}
	
	return fibonacci;
})();

这个版本的斐波那契的实现使用cache变量缓存了函数执行的结果,运行起来要比原来的那个速度快几个数量级,然而,把计算和缓存逻辑混合是有些难看。我们添加一个通用的函数给Function.prototype以帮助分离它们。

if (!Function.prototype.memoize) {
	Function.prototype.memoize = function() {
		var cache = {};
		var	func = this;
		var join = Array.prototype.join;
		
		return function(x) {
			var key = join.call(arguments);
			
			if (!(key in cache)) {
				cache [key] = func.apply(this, arguments);
			}
			
			return cache [key];
		}
	}
}

上面的方法将参数使用Array的join函数将所有参数转换为字符串做为key存储再缓存变量中

var fibonacci = fibonacci.memoize();
fibonacci(30);


这样就使第一个例子拥有了记忆功能,加快了浏览器的运算速度。





没有更多推荐了,返回首页