奇怪的速度导致Javascript中的memoized fibonacci函数

时间:2014-07-29 00:32:44

标签: javascript memoization

我整理了简单的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测试,现在似乎更有意义。

1 个答案:

答案 0 :(得分:1)

我不确定为什么memTestHalfAsses在Chrome中更快,但这可能是缓存访问出错的一些优化。其他浏览器并没有显示出这种差异。

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

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