Comparison of memoization implementations (v20)

Revision 20 of this benchmark created by Asen Bozhilov on


Preparation HTML

<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

Ready to run.

Testing in
TestOps/sec
Memo 8
fib = memoize8(fiborg);
fib(20);
 
ready
Memo 2 - addy, phil, mathias, dmitry
fib = memoize2(fiborg);
fib(20);

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

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.