JavaScript 缓存函数

在我《惰性函数》一文引起一些争议,有人总是把惰性函数与缓存函数(Memoization)混为一谈。虽然都是缓存了结果,但最大的区别是一个改写函数本身,一个没有。那我就说一下缓存函数吧。简而言之,就是把上次运算的结果放到一个数组或对象中。

拿什么做试验好呢?就拿那个Fibonacci数列吧,估计IE6会比较呛,一般5秒运算不了就假死了。我们先看消耗时间,再看结果。

一直接用递归实现:


      function fib(n){
        if (n == 0 || n == 1)
          return 1;
        return fib(n-1) + fib(n-2);
      }
function fib(n){ if (n == 0 || n == 1) return 1; return fib(n-1) + fib(n-2); } var time1 = new Date var b = fib(30) var time2 = new Date - time1 alert(time2) alert(b)

运行代码

再看缓存函数。国内也有许多实现,都集中在realazy的这篇贴子《JavaScript Memoization》中冒泡了!


 function Memoize(func, obj){
    var obj = obj || window,
        func = obj[func],
        cache = {};
    return function(){
        var key = Array.prototype.join.call(arguments, '_');//如果存在多个参数,如1,2,3,
        //则以1_2_3这样的字符串作为key,函数计算结果为value存于对象中
        if (!(key in cache))
            cache[key] = func.apply(obj, arguments);
        return cache[key];
    }
}

var fib = {
    fib: function(n){
         if (n == 0 || n == 1)
             return 1;
        return this.fib(n-1) + this.fib(n-2);
    },
    fib_memo: function(n){
         if (n == 0 || n == 1)
             return 1;
        return this.fib_memo(n-1) + this.fib_memo(n-2);
    }
}

fib.fib_memo = Memoize('fib_memo', fib);
function Memoize(func, obj){ var obj = obj || window, func = obj[func], cache = {}; return function(){ var key = Array.prototype.join.call(arguments, '_'); if (!(key in cache)) cache[key] = func.apply(obj, arguments); return cache[key]; } } var fib = { fib: function(n){ if (n == 0 || n == 1) return 1; return this.fib(n-1) + this.fib(n-2); }, fib_memo: function(n){ if (n == 0 || n == 1) return 1; return this.fib_memo(n-1) + this.fib_memo(n-2); } } fib.fib_memo = Memoize('fib_memo', fib); var time1 = new Date var b = fib.fib_memo(30) var time2 = new Date - time1 alert(time2) alert(b)

运行代码

简化一下:反正只有一个参数,就改用数组吧。


      var memoize = function(fn) {
        var cache = [];
        return function(i) {
          return (i in cache) ? cache[i] :
            (cache[i] = fn.call(arguments.callee, i));
        };
      }

      var fib2 = new memoize(function(i) {
        if (i == 0 || i == 1)
          return 1;
        return this(i-1) + this(i-2);
      })
var memoize = function(fn) { var cache = []; return function(i) { return (i in cache) ? cache[i] : (cache[i] = fn.call(arguments.callee, i)); }; } var fib2 = new memoize(function(i) { if (i == 0 || i == 1) return 1; return this(i-1) + this(i-2); }) var time1 = new Date var b = fib2(30) var time2 = new Date - time1 alert(time2); alert(b)

运行代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值