jsPerf.app is an online JavaScript performance benchmark test runner & jsperf.com mirror. It is a complete rewrite in homage to the once excellent jsperf.com now with hopefully a more modern & maintainable codebase.
jsperf.com URLs are mirrored at the same path, e.g:
https://jsperf.com/negative-modulo/2
Can be accessed at:
https://jsperf.app/negative-modulo/2
Testing widely used inheritance libraries against Fiber.js, ExtJS, TypeScript, DNW FastClass and Native javascript All other libraries are either previous variances of DNW FastClass or are way too weak to compete with the above ones.
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://code.jquery.com/jquery-1.9.1.min.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="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.1/underscore-min.js">
</script>
<script src="//cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.0/backbone-min.js">
</script>
<script src="//ajax.googleapis.com/ajax/libs/mootools/1.3/mootools-yui-compressed.js">
</script>
<script src="//ajax.googleapis.com/ajax/libs/ext-core/3/ext-core.js">
</script>
<script src="http://kiro.me/temp/fiber.js">
</script>
<script>
//DNW.FastClass - fork me on GitHub https://github.com/dotnetwise/Javascript-FastClass
Function.prototype.selfExtend = function(creator) {
var ctor = creator(this.prototype, this);
ctor.prototype = this.prototype;
var c = new ctor();
c.constructor.prototype = c;
return c.constructor;
};
</script>
(function() {
//old variations of DNW.FastClass
var canDefineNonEnumerableProperty = typeof Object.defineProperty === "function";
function __() {};
Function.prototype.inherit = function(creator, makeConstructorNotEnumerable) {
/// <summary>Inherits the prototype of the given function. The creator function should return a new Constructor function whose prototype will share this functions's prototype</summary>
/// <param name="creator" type="Function">function(base, baseConstructor) {<br/>
/// return function Derived() { <br/>
/// base.apply(this, arguments); <br/>
/// } <br/>
/// Notice that there is no .override method call after the function Derrived(){}. This is very important. If you do want to override some methods then use .extend instead
/// </param>
/// <param name="makeConstructorNotEnumerable" type="Boolean">Object.defineProperty is rather slow. If you concern about performance and don't care about 'constructor' being enumerable in for (var i in instance) then let this false. <br/>
/// Otherwise set it to true and we will redefine the correct constructor i.e. Extendee.prototype.constructor === Extendee that is non-Enumerable
/// </param>
__.prototype = this.prototype;
var Derived = creator.call(this, this.prototype, this);
Derived.prototype = new __;
this.__class = Derived.__class = true;
//if we care about Extendee.prototype.constructor === Extendee to be non-Enumerable
//By default we set the constructor but we don't make it non-enumerable
if (makeConstructorNotEnumerable && canDefineNonEnumerableProperty) //this is not default as it carries over some performance overhead
Object.defineProperty(extendeePrototype, 'constructor', {
enumerable: false,
value: Derived
});
else Derived.prototype.constructor = Derived; //Also fallback for older non-ECMA-5 browsers
return Derived;
};
Function.prototype.extend = function(creator) {
/// <summary>Extends the prototype of the given function. The creator function should return a new Constructor function whose prototype will share this functions's prototype.</summary>
/// <param name="creator" type="Function">function(base, baseConstructor) {<br/>
/// return function Derived() { <br/>
/// base.apply(this, arguments); <br/>
/// }.override(base, { //custom functions to be added on Derived.prototype <br/>
/// method: function() { <br/>
/// return base.method.apply(this, arguments); //call the base class' method, assuming is any <br/>
/// } <br/>
/// }); <br/>
/// So it is very important to call the .override at the end. If you simply want to inherit from an object with no overrides then you should call .inherit function instead
/// </param>
var Derived = creator.call(this, this.prototype, this);
this.__class = Derived.__class = true;
return Derived;
};
Function.prototype.define = function(prototype) {
/// <summary>Define members on the prototype of the given function with the custom methods and fields specified in the prototype parameter.</summary>
/// <param name="prototype" type="Plain Object">A custom object with the methods or properties to be added on Extendee.prototype</param>
var extendeePrototype = this.prototype;
if (prototype) for (var p in prototype)
extendeePrototype[p] = prototype[p];
return this;
}
Function.prototype.override = function(basePrototype, prototype, makeConstructorNotEnumerable) {
/// <summary>Extends the prototype of the given function with the custom methods and fields specified in the prototype parameter.</summary>
/// <param name="prototype" type="Plain Object">A custom object with the methods or properties to be added on Extendee.prototype</param>
__.prototype = basePrototype;
var extendeePrototype = new __;
this.prototype = extendeePrototype;
//if we care about Extendee.prototype.constructor === Extendee to be non-Enumerable
//By default we set the constructor but we don't make it non-enumerable
if (makeConstructorNotEnumerable && canDefineNonEnumerableProperty) //this is not default as it carries over some performance overhead
Object.defineProperty(extendeePrototype, 'constructor', {
enumerable: false,
value: this
});
else extendeePrototype.constructor = this;
if (prototype) for (var p in prototype)
extendeePrototype[p] = prototype[p];
return this;
}
Function.prototype.inheritWith = function(creator, makeConstructorNotEnumerable) {
/// <summary>Extends the prototype of the given function with the custom methods and fields specified in the prototype parameter.</summary>
/// <param name="prototype" type="Plain Object">A custom object with the methods or properties to be added on Extendee.prototype</param>
var baseCtor = this;
var creatorResult = creator.call(this, this.prototype, this) || {};
var Derrived = creatorResult.constructor ||
function defaultCtor() {
baseCtor.apply(this, arguments);
}; //automatic constructor if ommited
var derrivedPrototype;
__.prototype = this.prototype;
Derrived.prototype = derrivedPrototype = new __;
for (var p in creatorResult)
derrivedPrototype[p] = creatorResult[p];
//By default we set the constructor but we don't make it non-enumerable
//if we care about Derrived.prototype.constructor === Derrived to be non-Enumerable we need to use Object.defineProperty
if (makeConstructorNotEnumerable && canDefineNonEnumerableProperty) //this is not default as it carries over some performance overhead
Object.defineProperty(derrivedPrototype, 'constructor', {
enumerable: false,
value: Derrived
});
return Derrived;
};
})();
///Define ctor A
function AA() {
function A(val) {
this.val = val;
};
A.prototype.method1 = function(x, y, z) {
this.x = x;
this.y = y;
this.x = z;
};
return A;
}
//Creates 100 instances of A, B and C and calls .method1 on them
function RunTests() {
for (var i = 0; i < 100; i++) {
var a = new A("a");
a.method1("x", "y", "z");
var b = new B("b");
b.method1("y", "z");
var c = new C("c");
c.method1("z");
}
}
Ready to run.
Test | Ops/sec | |
---|---|---|
John Resig's Class |
| ready |
Klass |
| ready |
Classy |
| ready |
Backbone.js |
| ready |
ExtJS |
| ready |
PTClass (Prototype.js) |
| ready |
Fiber.js |
| ready |
Native |
| ready |
TypeScript |
| ready |
DotNetWise extend |
| ready |
DotNetWise extend - fix constructor |
| ready |
DotNetWise inheritWith |
| ready |
DNW SelfCall |
| ready |
DNW FastClass |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.