JavaScript 캐 시 함수

3342 단어 JavaScript
나의 라 는 글 에서 일부 논쟁 을 일 으 켰 는데, 어떤 사람 은 항상 타성 함수 와 캐 시 함수 (Memoization) 를 혼동 했다.모두 캐 시 된 결과 이지 만 가장 큰 차이 점 은 개작 함수 자체 이 고 하나 도 없습니다.그럼 캐 시 함수 말씀 드릴 게 요.쉽게 말 하면 지난번 연산 결 과 를 배열 이나 대상 에 넣 는 것 이다.
무엇으로 시험 해 볼 까요?그 피 보 나치 수열 을 가 져 가세 요. 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 의 이 스티커 인 에서 거품 이 일 었 다!

 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)
실행 코드

좋은 웹페이지 즐겨찾기