JavaScript 緩衝函數

來源:互聯網
上載者:User

在我《惰性函數》一文引起一些爭議,有人總是把惰性函數與緩衝函數(Memoization)混為一談。雖然都是緩衝了結果,但最大的區別是一個改寫函數本身,一個沒有。那我就說一下緩衝函數吧。簡而言之,就是把上次運算的結果放到一個數組或對象中。

拿什麼做實驗好呢?就拿那個Fibonacci數列吧,估計IE6會比較嗆,一般5秒運算不了就假死了。我們先看消耗時間,再看結果。

一直接用遞迴實現:

      function fib(n){        if (n == 0 || n == 1)          return 1;        return fib(n-1) + fib(n-2);      }

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

運行代碼

再看緩衝函數。國內也有許多實現,都集中在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,Function Compute結果為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);

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

運行代碼

簡化一下:反正只有一個參數,就改用數組吧。

      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);      })

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

運行代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.