Javascript中记忆fibonacci函数的奇怪速度结果



我把简单的记忆的例子和运行一些性能测试,但不明白为什么在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中更快,但这可能是一些优化在缓存访问中出错。其他浏览器没有显示此差异。

测试并没有真正衡量实现之间的差异,只是当值已经在缓存中时缓存工作得如何。测试代码将运行数百万次,而这只是第一次执行会有所不同。之后,memTestmemTestHalfAssed都将立即返回缓存的值。

要查看它们之间的区别,您需要将memTestmemTextHalfAssed的创建从准备代码移到测试代码中,或者清空测试代码中函数的缓存。

最新更新