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

Javascript中记忆fibonacci函数的奇怪速度结果,javascript,memoization,Javascript,Memoization,我总结了一个简单的记忆化示例,并运行了一些性能测试,但不明白为什么Chrome上的memTestHalfAssed是最快的,即使fibonacciH内部调用没有记忆。测试正在进行中 函数斐波那契(n){ 返回n

我总结了一个简单的记忆化示例,并运行了一些性能测试,但不明白为什么Chrome上的
memTestHalfAssed
是最快的,即使
fibonacciH
内部调用没有记忆。测试正在进行中

函数斐波那契(n){
返回n<2?n:fibonacci(n-1)+fibonacci(n-2);
}
Function.prototype.memoized=函数(a){
如果(typeof this.cache==“未定义”)this.cache=[];
if(this.cache[a]){
返回这个.cache[a];
}否则{
this.cache[a]=this(a);
返回这个.cache[a];
}
}
Function.prototype.memoize=Function(){
var t=这个;
返回函数(){
返回t.memonized.apply(t,参数);
//返回t.memonized(参数[0]);
}
}
memTest=(函数fibonacciM(n){
返回n<2?n:fibonacciM.memonized(n-1)+fibonacciM.memonized(n-2);
}).memoize();
memTestHalfAssed=(函数fibonacciH(n){
返回n<2?n:fibonacciH(n-1)+fibonacciH(n-2);
}).memoize();
编辑:


我根据Gaffa的答案更新了第1版测试,现在似乎更有意义了。

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

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


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

如果必须获得斐波那契序列的
50000+k
第th个值(对于较小的
k
)一百万次,我想你可能会不敢苟同。@user2864740你能详细解释一下为什么斐波那契是一个如此糟糕的例子吗?什么是更好的例子?我不是一个讨厌的人但我真的想知道,thanks@spirytus因为它经常被教导记忆是如何让事情变得更快的。。但是(除非你按照JayC多次说的做),它通常更有效。
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();