Memoization vs. Direct calling

Benchmark created by Addy Osmani on


Preparation HTML

<script>
   //by @philogbs and @addyosmani
    function memoize2(fn) {
          return function () {
              var args = Array.prototype.slice.call(arguments),
                  hash = "",
                  i  = args.length;
              while(i--){
                hash += (Object.prototype.toString.call({}) == Object.prototype.toString.call(args[i])) ? JSON.stringify(args[i]) : args[i];
                fn.memoize = fn.memoize || {};
            } 
              return (hash in fn.memoize) ? fn.memoize[hash] : fn.memoize[hash] = fn.apply(this, args);
          };
      }
    
  //stoyans version
  function memoize7(param){
      if (!memoize7.cache) {
          memoize7.cache = {};
      }
      if (!memoize7.cache[param]) {
          var result = fib(param);
          memoize7.cache[param] = result;
      }
      return memoize7.cache[param];
  }
  
   function fib(x) {
          if(x < 2) return 1; else return fib(x-1) + fib(x-2);
      }
    
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Memoize2
var fibTest2 = memoize2(fib);
console.log(fibTest2(25));

//cached
setTimeout(function(){
        fibTest2(25);
}, 1000);
ready
Directly calling
console.log(fib(25));

//obviously this part will not be cached,
//requiring a recalculation.
setTimeout(function(){
        fib(25);
}, 1000);
ready
Memoize7
console.log(memoize7(25));

setTimeout(function(){
  memoize7(25);
}, 1000);
ready

Revisions

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

  • Revision 1: published by Addy Osmani on
  • Revision 2: published by Addy Osmani on
  • Revision 3: published by Oleg on