Prototype vs Module pattern performance (v64)

Revision 64 of this benchmark created by Jonathan Perry on


Description

Removed iterations in tests, because jsperf already does that for us. And renamed variables to be more meaningful to us humans. And other cosmetic changes.

The most important thing to remember is to use the right tool for the job. All these tests do is reference an object with a complex memory allocation. When you don't need something fancy, you're better off using a regular old object

Setup

function TraditionalPrototypeClass() {
    }
    
    TraditionalPrototypeClass.prototype.foo = function() {
    console.log('a');
    };
    
    TraditionalPrototypeClass.prototype.bar = function() {
    console.log('b');
    };
    
    function ModulePatternClass() {
        this.foo = function() {
    console.log('a');
        };
        
        this.bar = function() {
    console.log('b');
        };
    }
    
    var ModuleCachePatternClass = (function () {
        function foo() {
    console.log('a');
        }
        
        function bar() {
    console.log('b');
        }
        
        return function () {
            this.foo = foo;
            this.bar = bar;
        };
    
    }());
    
    function TraditionalObject() { 
      this.foo = function () {
    console.log('a');
      }
      this.bar = function () {
    console.log('b');
      }
    }
    
    function FakeClass() {
        
        function __constructor() {
            this.init();
        }
    
        __constructor.prototype.init = function() {
        };
    
    
        __constructor.prototype.foo = function(){
    console.log('a');
        };
        
        __constructor.prototype.bar = function(){
    console.log('a');
        };
    
        return new __constructor();
    
    }
    
    function FakeClassNoInit() {
        
        function __constructor() {
        }
    
        __constructor.prototype.foo = function(){
    console.log('a');
        };
        
        __constructor.prototype.bar = function(){
    console.log('a');
        };
    
        return new __constructor();
    
    }

Test runner

Ready to run.

Testing in
TestOps/sec
Traditional Prototypal Class
var a = [];
for(var i=2000; i=0; i--)
{
    a.push(new TraditionalPrototypeClass());
}
for(var i=2000; i=0; i--)
{
    a[i].bar;
    a[i].foo;
}
ready
Module Pattern Class
var a = [];
for(var i=2000; i=0; i--)
{
    a.push(new ModulePatternClass());
}
for(var i=2000; i=0; i--)
{
    a[i].bar;
    a[i].foo;
}
ready
Module Pattern Class with cached functions
var a = [];
for(var i=2000; i=0; i--)
{
    a.push(new ModuleCachePatternClass());
}
for(var i=2000; i=0; i--)
{
    a[i].bar;
    a[i].foo;
}
ready
Traditional Class
var a = [];
for(var i=2000; i=0; i--)
{
    a.push(new TraditionalObject());
}
for(var i=2000; i=0; i--)
{
    a[i].bar;
    a[i].foo;
}
ready
Fake Class
var a = [];
for(var i=2000; i=0; i--)
{
    a.push(new FakeClass());
}
for(var i=2000; i=0; i--)
{
    a[i].bar;
    a[i].foo;
}
ready
Fake Class without init
var a = [];
for(var i=2000; i=0; i--)
{
    a.push(new FakeClassNoInit());
}
for(var i=2000; i=0; i--)
{
    a[i].bar;
    a[i].foo;
}
ready

Revisions

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