我把简单的记忆的例子和运行一些性能测试,但不明白为什么在Chrome memTestHalfAssed
是最快的,即使fibonacciH
调用里面没有记忆。测试在http://jsperf.com/moize-test
function fibonacci(n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
Function.prototype.memoized = function(a) {
if (typeof this.cache === "undefined") this.cache = [];
if (this.cache[a]) {
return this.cache[a];
} else {
this.cache[a] = this(a);
return this.cache[a];
}
}
Function.prototype.memoize=function() {
var t=this;
return function() {
return t.memoized.apply(t,arguments);
//return t.memoized(arguments[0]);
}
}
memTest= (function fibonacciM(n) {
return n < 2 ? n : fibonacciM.memoized(n - 1) + fibonacciM.memoized(n - 2);
}).memoize();
memTestHalfAssed = (function fibonacciH(n) {
return n < 2 ? n : fibonacciH(n - 1) + fibonacciH(n - 2);
}).memoize();
编辑:我根据Gaffa的答案更新了Revision 1的测试,现在看起来更有意义了。
我不知道为什么memTestHalfAsses
在Chrome中更快,但这可能是一些优化在缓存访问中出错。其他浏览器没有显示此差异。
测试并没有真正衡量实现之间的差异,只是当值已经在缓存中时缓存工作得如何。测试代码将运行数百万次,而这只是第一次执行会有所不同。之后,memTest
和memTestHalfAssed
都将立即返回缓存的值。
要查看它们之间的区别,您需要将memTest
和memTextHalfAssed
的创建从准备代码移到测试代码中,或者清空测试代码中函数的缓存。