JavaScript Object Oriented Libraries Benchmark (v169)

Revision 169 of this benchmark created by Enzo on


Description

=== FULL TEST ==

MooTools and Ext Core are removed because they add extra information into native classes. They slow down other libraries.

Ext Core OOP is fast, MooTools OOP is super slow!

TODO: - Add YUI

Preparation HTML

<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jsface.js"></script>
<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jsface.js"></script>

<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/my.class.js"</script>
<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/my.class.js"</script>

<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jrclass.js"</script>
<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/jrclass.js"</script>

<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/klass.js"></script>
<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/klass.js"></script>

<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/classy.js"></script>
<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/classy.js"></script>

<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/ptclass.js"</script>
<script src="http://dl.dropbox.com/u/7677927/oop-benchmark/lib/ptclass.js"</script>

<script>
var inherit=function(){"use strict";var i,j,k,a="object",b="prototype",c="constructor",d=function(){},e=arguments,f=e[0],g=1==e.length?d:e[1],h=typeof f===a;return typeof g===a?(i=d,i[b]=g):(i=g,i[b]=h?f:new f),j=new i(i[b]),k=!j.hasOwnProperty(c),(k&&f===j[c]||k&&h)&&(j[c]=d),j[c][b]=j,j[c]};
/*jslint newcap:true */ 
var inherit0 = function() {
        'use strict';
        var len = arguments.length,
                parent = (len > 1) ? arguments[0] : function(){},
                body = arguments[len - 1];

        body.prototype = Object.create(parent.prototype);
        var prototype = new body(body.prototype);
        prototype.constructor.prototype = prototype;
        return prototype.constructor;
};
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
JSFace
var JSFacePerson = jsface.Class({
  constructor: function(name){
    this.name = name;
  },
  setAddress: function(country, city, street) {
    this.country = country;
    this.city = city;
    this.street = street;
  }
});

var JSFaceFrenchGuy = jsface.Class(JSFacePerson, {
  constructor: function(name) {
    JSFaceFrenchGuy.$super.call(this, name);
  },
  setAddress: function(city, street) {
    JSFaceFrenchGuy.$superp.setAddress.call(this, 'France', city, street);
  }
});

var JSFaceParisLover = jsface.Class(JSFaceFrenchGuy, {
  constructor: function(name) {
    JSFaceParisLover.$super.call(this, name);
  },
  setAddress: function(street) {
    JSFaceParisLover.$superp.setAddress.call(this, 'Paris', street);
  }
});

var p1 = new JSFacePerson("John");
p1.setAddress("US", "MT", "CH");

var p2 = new JSFaceFrenchGuy("Leo");
p2.setAddress("MT", "CH");

var p3 = new JSFaceParisLover("Mary");
p3.setAddress("CH");
ready
my.Class
var MyPerson = my.Class({
  constructor: function(name){
    this.name = name;
  },
  setAddress: function(country, city, street) {
    this.country = country;
    this.city = city;
    this.street = street;
  }
});

var MyFrenchGuy = my.Class(MyPerson, {
  constructor: function(name) {
    MyFrenchGuy.Super.call(this, name);
  },
  setAddress: function(city, street) {
    MyFrenchGuy.Super.prototype.setAddress.call(this, 'France', city, street);
  }
});

var MyParisLover = my.Class(MyFrenchGuy, {
  constructor: function(name) {
    MyParisLover.Super.call(this, name);
  },
  setAddress: function(street) {
    MyParisLover.Super.prototype.setAddress.call(this, 'Paris', street);
  }
});

var p4 = new MyPerson("John");
p4.setAddress("US", "MT", "CH");

var p5 = new MyFrenchGuy("Leo");
p5.setAddress("MT", "CH");

var p6 = new MyParisLover("Mary");
p6.setAddress("CH");
ready
John Resig Class
var JRPerson = JRClass.extend({
  init: function(name){
    this.name = name;
  },
  setAddress: function(country, city, street) {
    this.country = country;
    this.city = city;
    this.street = street;
  },
  sayHello: function() {
    console.log('I am ' + this.name + '. My address is ' +
        this.country + ', ' + this.city + ', ' + this.street + '.');
  }
});

var JRFrenchGuy = JRPerson.extend({
  init: function(name) {
    this._super(name);
  },
  setAddress: function(city, street) {
    this._super('France', city, street);
  }
});

var JRParisLover = JRFrenchGuy.extend({
  init: function(name) {
    this._super(name);
  },
  setAddress: function(street) {
    this._super('Paris', street);
  }
});

var p7 = new JRPerson("John");
p7.setAddress("US", "MT", "CH");

var p8 = new JRFrenchGuy("Leo");
p8.setAddress("MT", "CH");

var p9 = new JRParisLover("Mary");
p9.setAddress("CH");
ready
Klass
var EnderPerson = klass(function(name) {
  this.name = name;
})
.methods({
  setAddress: function(country, city, street) {
    this.country = country;
    this.city = city;
    this.street = street;
  }
});

var EnderFrenchGuy = EnderPerson.extend(function(name) {
})
.methods({
  setAddress: function(city, street) {
    this.supr('France', city, street);
  }
});

var EnderParisLover = EnderFrenchGuy.extend(function(name) {
})
.methods({
  setAddress: function(street) {
    this.supr('Paris', street);
  }
});

var p10 = new EnderPerson("John");
p10.setAddress("US", "MT", "CH");

var p11 = new EnderFrenchGuy("Leo");
p11.setAddress("MT", "CH");

var p12 = new EnderParisLover("Mary");
p12.setAddress("CH");
ready
Classy
var ClassyPerson = Classy.$extend({
  __init__: function(name){
    this.name = name;
  },
  setAddress: function(country, city, street) {
    this.country = country;
    this.city = city;
    this.street = street;
  }
});

var ClassyFrenchGuy = ClassyPerson.$extend({
  __init__: function(name) {
    this.$super(name);
  },
  setAddress: function(city, street) {
    this.$super('France', city, street);
  }
});

var ClassyParisLover = ClassyFrenchGuy.$extend({
  __init__: function(name) {
    this.$super(name);
  },
  setAddress: function(street) {
    this.$super('Paris', street);
  }
});

var p13 = new ClassyPerson("John");
p13.setAddress("US", "MT", "CH");

var p14 = new ClassyFrenchGuy("Leo");
p14.setAddress("MT", "CH");

var p15 = new ClassyParisLover("Mary");
p15.setAddress("CH");
ready
PTClass
var PTClassPerson = PTClass.create({
  initialize: function(name){
    this.name = name;
  },
  setAddress: function(country, city, street) {
    this.country = country;
    this.city = city;
    this.street = street;
  }
});

var PTClassFrenchGuy = PTClass.create(PTClassPerson, {
  initialize: function($super, name) {
    $super(name);
  },
  setAddress: function($super, city, street) {
    $super('France', city, street);
  }
});

var PTClassParisLover = PTClass.create(PTClassFrenchGuy, {
  initialize: function($super, name) {
    $super(name);
  },
  setAddress: function($super, street) {
    $super('Paris', street);
  }
});

var p16 = new PTClassPerson("John");
p16.setAddress("US", "MT", "CH");

var p17 = new PTClassFrenchGuy("Leo");
p17.setAddress("MT", "CH");

var p18 = new PTClassParisLover("Mary");
p18.setAddress("CH");
ready
inherit 1.1
var InheritPerson = inherit(function () {
    this.constructor = function(name) {
        this.name = name;
    };
    this.setAddress = function(country, city, street) {
        this.country = country;
        this.city = city;
        this.street = street;
    };
});

var InheritFrenchGuy = inherit(InheritPerson, function(base) {
        this.constructor = function (name) {
          base.constructor.call(this, name);
        };
   
        this.setAddress = function(city, street) {
          base.setAddress.call(this, "France", city, street);
        };
});

var InheritParisLover = inherit(InheritFrenchGuy, function(base) {
    this.constructor= function (name) {
        base.constructor.call(this, name);
    };
   
    this.setAddress = function(street) {
        base.setAddress.call(this, "Paris", street);
        return this;
    };
});

var p19 = new InheritPerson("John");
p19.setAddress("US", "MT", "CH");

var p20 = new InheritFrenchGuy("Leo");
p20.setAddress("MT", "CH");

var p21 = new InheritParisLover("Mary");
p21.setAddress("CH");
ready
inherit 1.0
var InheritPerson0 = inherit0(function () {
        this.constructor = function(name) {
            this.name = name;
        };
        this.setAddress = function(country, city, street) {
            this.country = country;
            this.city = city;
            this.street = street;
        };
    });
    
    var InheritFrenchGuy0 = inherit0(InheritPerson0, function(base) {
            this.constructor = function (name) {
              base.constructor.call(this, name);
            };
       
            this.setAddress = function(city, street) {
              base.setAddress.call(this, "France", city, street);
            };
    });
    
    var InheritParisLover0 = inherit0(InheritFrenchGuy0, function(base) {
        this.constructor= function (name) {
            base.constructor.call(this, name);
        };
       
        this.setAddress = function(street) {
            base.setAddress.call(this, "Paris", street);
            return this;
        };
    });

var t1 = new InheritPerson0("John");
t1.setAddress("US", "MT", "CH");

var t2 = new InheritFrenchGuy0("Leo");
t2.setAddress("MT", "CH");

var t3 = new InheritParisLover0("Mary");
t3.setAddress("CH");
ready

Revisions

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