Nested Named Functions compared to Module Pattern without last module pattern (v31)

Revision 31 of this benchmark created by Digitale Welten on


Description

Demonstrating the performance hit caused by nested functions and testing against module pattern, without certain module pattern.

Preparation HTML

<script>
(function(){var f={},g=Array.prototype.slice;window.define=function(){var a=arguments,d=a[0],b=null;a=g.call(a,1);if(a.length>1){b=a[0];for(var c=[],e=0;e<b.length;e++)c[e]=f[b[e]];b=a[1].apply(this,c)}else b=a[0]();f[d]=b};window.require=function(){var a=arguments,d=[],b=null;a.length>2&&(a=g.call(a,1));d=a[0];b=a[1];a=[];for(var c=0;c<d.length;c++)a[c]=f[d[c]];b.apply(this,a)}})();
</script>
<script>
  (function() {

    // Nested function
    person = function(age) {
      function getNextAge() {
        return age + 1;
      }
      return getNextAge();
    }

    // Non nested function inner function

    function getNextAge2(age) {
      return age + 1;
    }

    // Non nested function
    person2 = function(age) {
      return getNextAge2(age);
    }

  }());

var optimizedClosure = (function(self) {

    // Nested function
    self.person = function(age) {
      var getNextAge = function(age) {
        return age + 1;
      }
      return getNextAge(age);
    }

    // Non nested function inner function

    var getNextAge2 = function(age) {
      return age + 1;
    }

    // Non nested function
    self.person2 = function(age) {
      return getNextAge2(age);
    }

    return self;

  }([]));

// YUI style (http://www.yuiblog.com/blog/2007/06/12/module-pattern/)
var myNamespace = myNamespace || {};
myNamespace.module1 = (function() {
         
    //"private" method:
    var getNextAge3 = function(age) {
        return age + 1;
    }          
      
    return {
        person3: function(age) {
            return getNextAge3(age);
        }
    };
}());


// Adding New Functionality to the person4
// http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/
(function( person4, $, undefined ) {
                    
    person4.Age = 0;
                                
    //Public Method
    person4.getNextAge = function() {
        return person4.Age + 1;
    };    
}( window.person4 = window.person4 || {}, {} ));

(function() {
  define('person5', function() {
    function person5(_age) {
      var _this = this;
      _this.age = _age;
      _this.getNextAge = function() {
        return _this.age + 1
      }
    }
    return person5;
  });
}());
</script>

Setup

var person5;
    (function() {
      require(['person5'], function(CLASS) {
          person5 = (new CLASS(10)).getNextAge;
      });
    }());

Test runner

Ready to run.

Testing in
TestOps/sec
Optimized (No Nesting)
person2(10);
ready
Nested Function
person(10);
ready
Module Pattern (YUI style (http://www.yuiblog.com/blog/2007/06/12/module-pattern/))
myNamespace.module1.person3(10);
ready
Nested Function
optimizedClosure.person(10);
ready
No Nesting
optimizedClosure.person2(10);
ready
define / require
person5(10);
ready

Revisions

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