我整理了简单的memoization示例并运行了一些性能测试,但不明白为什么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的回答更新了修订版1测试,现在似乎更有意义。
答案 0 :(得分:1)
我不确定为什么memTestHalfAsses
在Chrome中更快,但这可能是缓存访问出错的一些优化。其他浏览器并没有显示出这种差异。
测试并没有真正衡量实现之间的差异,只是当值已经在缓存中时缓存的工作情况。测试代码将运行数百万次,并且它只是第一次执行不同。之后,memTest
和memTestHalfAssed
都将立即返回缓存值。
要查看它们之间的区别,您需要将准备代码中memTest
和memTextHalfAssed
的创建移动到测试代码中,或者清空测试代码中函数的缓存。 / p>