Comparison of memoization implementations

JavaScript performance comparison

Revision 22 of this test case created by jbdemonte

Info

just some fix on memo2

Preparation code

<script>
 
 
  //memo1
  //underscore.js implem
 
  function memoize1(func, hasher) {
      var memo = {};
      hasher || (hasher = function(value){
        return value; //^this could be done better..surely..
      });
      return function() {
        var key = hasher.apply(this, arguments);
        return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
      };
    };
 
 
  //memoize.js - by @addyosmani, @philogb, @mathias
  // with a few useful tweaks from @DmitryBaranovsk
  function memoize2( fn ) {
        return function () {
                var args = Array.prototype.slice.call(arguments),
                hash = "",
                i  = args.length,
                currentArg = null;
                while(i--){
                        currentArg = args[i];
                        hash += (currentArg === Object(currentArg)) ?
                                JSON.stringify(currentArg) : currentArg;
                }
                fn.memoize || (fn.memoize = {});
                return (hash in fn.memoize) ? fn.memoize[hash] :
                        fn.memoize[hash] = fn.apply( this , args );
        };
  }
 
  //memo4 - by stevenlevithan
  function memoize4(functor, expiration) {
        var memo = {};
        return function () {
                var key = Array.prototype.join.call(arguments, "§");
                if (key in memo)
                        return memo[key];
                if (expiration)
                        setTimeout(function () {delete memo[key];}, expiration);
                return memo[key] = functor.apply(this, arguments);
        };
  }
 
//@abozhilov
//Based on the @stevenlevithan memoize4 version
function memoize8(fn) {
    var memo = {};
    return function () {
        var key = [].join.call(arguments, '§') + '§';
        return (key in memo) ? memo[key] : memo[key] = fn.apply(this, arguments);
    };              
}
 
  var fib, fiborg;
  fiborg = fib = function (x) {
      if(x < 2) return 1; else return fib(x-1) + fib(x-2);
  }
 
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
Memo 8
fib = memoize8(fiborg);
fib(20);
 
pending…
Memo 2 - addy, phil, mathias, dmitry, jbdemonte
fib = memoize2(fiborg);
fib(20);

 
pending…
Memo 4 - stevenlevithan
fib = memoize4(fiborg);
fib(20);
 
pending…
abozhilov's mod of memoize 4
fib = memoize8(fiborg);
fib(20);
 
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment