JavaScript Object Oriented Libraries Benchmark (v79)

Revision 79 of this benchmark created by André Cruz on


Description

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

Please note that JSFace inheritance model does not play well with the native instanceof. Thats also why it is faster in firefox than any other library.

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/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/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/ptclass.js"></script>

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

<script src="http://indigounited.com/dejavu/dejavu.js"></script>
<script>
var dejavuClassPerson = dejavu.Class.declare({
  initialize: function(name){
    this.name = name;
  },
  setAddress: function(country, city, street) {
    this.country = country;
    this.city = city;
    this.street = street;
  }
});

var dejavuClassFrenchGuy = dejavu.Class.declare({
  $extends: dejavuClassPerson,
  setAddress: function(city, street) {
    this.$super('France', city, street);
  }
});

var dejavuClassParisLover = dejavu.Class.declare({
  $extends: dejavuClassFrenchGuy,
  setAddress: function(street) {
    this.$super('Paris', street);
  }
});

var dejavuClassPerson2 = dejavu.Class.declare(function () {
  return {
        initialize: function(name){
            this.name = name;
        },
        setAddress: function(country, city, street) {
            this.country = country;
            this.city = city;
            this.street = street;
        }
    };
}, true);

var dejavuClassFrenchGuy2 = dejavuClassPerson2.extend(function ($super) {
   return {
       setAddress: function(city, street) {
           $super.setAddress.call(this, 'France', city, street);
       }
   };
}, true);

var dejavuClassParisLover2 = dejavuClassFrenchGuy2.extend(function ($super) {
    return {
        setAddress: function(street) {
            $super.setAddress.call(this, 'Paris', street);
        }
    };
}, true);

// inherits copied from npm package
function inherits (c, p, proto) {
  function F () { this.constructor = c; }
  F.prototype = p.prototype;
  var e = {};
  for (var i in c.prototype) if (c.prototype.hasOwnProperty(i)) {
    e[i] = c.prototype[i];
  }
  if (proto) for (var i in proto) if (proto.hasOwnProperty(i)) {
    e[i] = proto[i];
  }
  c.prototype = new F();
  for (var i in e) if (e.hasOwnProperty(i)) {
    c.prototype[i] = e[i];
  }
  c['super'] = p;
}

var VanillaPerson = function (name) {
  this.name = name;
};
VanillaPerson.prototype.setAddress = function(country, city, street) {
  this.country = country;
  this.city = city;
  this.street = street;
};

var VanillaFrenchGuy = function (name) {
  VanillaPerson.call(this, name);
};

inherits(VanillaFrenchGuy, VanillaPerson);

VanillaFrenchGuy.prototype.setAddress = function (city, street) {
  VanillaPerson.prototype.setAddress.call(this, 'France', city, street);
};


var VanillaParisLover = function (name) {
  VanillaFrenchGuy.call(this, name);
};

inherits(VanillaParisLover, VanillaFrenchGuy);

VanillaParisLover.prototype.setAddress = function (street) {
  VanillaFrenchGuy.prototype.setAddress.call(this, 'Paris', street);
};
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
vanilla
var p21 = new VanillaParisLover("Mary");
p21.setAddress("CH");
ready
dejavu (after optimization)
var p20 = new dejavuClassParisLover2("Mary");
p20.setAddress("CH");
ready
dejavu
var p19 = new dejavuClassParisLover("Mary");
p19.setAddress("CH");
ready
JSFace
var p3 = new JSFaceParisLover("Mary");
p3.setAddress("CH");
ready
my.Class
var p6 = new MyParisLover("Mary");
p6.setAddress("CH");
ready
John Resig Class
var p9 = new JRParisLover("Mary");
p9.setAddress("CH");
ready
Klass
var p12 = new EnderParisLover("Mary");
p12.setAddress("CH");
ready
Classy
var p15 = new ClassyParisLover("Mary");
p15.setAddress("CH");
ready
PTClass
var p18 = new PTClassParisLover("Mary");
p18.setAddress("CH");
ready

Revisions

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