Nested Named Functions compared to Module Pattern without last module pattern

JavaScript performance comparison

Revision 31 of this test case created by Digitale Welten

Preparation code

<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>
      
<script>
Benchmark.prototype.setup = function() {
  var person5;
  (function() {
    require(['person5'], function(CLASS) {
  	  person5 = (new CLASS(10)).getNextAge;
    });
  }());

};
</script>

Preparation code output

Test runner

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

Java applet disabled.

Testing in CCBot 2.0.0 / Other 0.0.0
Test Ops/sec
Optimized (No Nesting)
person2(10);
pending…
Nested Function
person(10);
pending…
Module Pattern (YUI style (http://www.yuiblog.com/blog/2007/06/12/module-pattern/))
myNamespace.module1.person3(10);
pending…
Nested Function
optimizedClosure.person(10);
pending…
No Nesting
optimizedClosure.person2(10);
pending…
define / require
person5(10);
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.

0 Comments