Inheritance performance - method calls (v6)

Revision 6 of this benchmark created by Billy Tetrud on


Description

Accurate tests of the fastest JavaScript class inheritance models. This test tests method calls.

These tests aim to provide adequate and accurate results by modeling real-life application behavior and avoiding common performance-testing pitfalls. For source code and detailed explanation of the techniques used to create accurate tests - please visit https://github.com/kogarashisan/PerfTests.

Tested libraries do not include Prototype or MooTools, because they are slow. Ext.JS is not included, because it affects results of other tests.

Related test:

Preparation HTML

<script src="http://kogarashisan.github.io/PerfTests/export/dependencies-v1.js"></script>
<script src="http://kogarashisan.github.io/PerfTests/export/bundle-v1.js"></script>
<script src="http://www.btetrud.com/files/proto.umd.js"></script>

<script>
var ProtoParent = proto(function() {var cache_buster_0502;

        this.init = function(instance_string) {var cache_buster_0503;
                this.counter = 0;
                this.instance_array = [];
                this.instance_string = instance_string;
        };

        this.method = function (prevent_inline) {var cache_buster_0504;
                if (this.counter > 99)
                        this.counter = this.counter / 2;
                else
                        this.counter++;
                if (prevent_inline) {
                        var i = 0;
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                        for (i = 0; i < 1; i++) dummy.method();
                }
        }
});

var ProtoChildA = proto(ProtoParent, function(superclass) {var cache_buster_0505;

        this.init = function(instance_string) {var cache_buster_0506;
                this.member_a = 1;
                superclass.init.call(this, instance_string);
        };

        this.method = function() {var cache_buster_0507;
                this.member_a = -this.member_a;
                superclass.method.call(this, false);
        }
});

var ProtoChildB = proto(ProtoParent, function(superclass) {var cache_buster_0508;

        this.init = function(instance_string) {var cache_buster_0509;
                this.member_b = -1;
                superclass.init.call(this, instance_string);
        };

        this.method = function() {var cache_buster_0510;
                this.member_b = -this.member_b;
                superclass.method.call(this, false);
        }
});


var TypeScriptinstanceA = new TypeScriptChildA("a");
var TypeScriptinstanceB = new TypeScriptChildB("b");
var TypeScriptinstanceC = new TypeScriptChildA("c");
var TypeScriptinstanceD = new TypeScriptChildB("d");
var TypeScriptinstanceE = new TypeScriptChildA("e");

var CMBrowserMonoChildinstanceA = new CMBrowserMonoChildA("a");
var CMBrowserMonoChildinstanceB = new CMBrowserMonoChildB("b");
var CMBrowserMonoChildinstanceC = new CMBrowserMonoChildA("c");
var CMBrowserMonoChildinstanceD = new CMBrowserMonoChildB("d");
var CMBrowserMonoChildinstanceE = new CMBrowserMonoChildA("e");

var CMBrowserPolyChildinstanceA = new CMBrowserPolyChildA("a");
var CMBrowserPolyChildinstanceB = new CMBrowserPolyChildB("b");
var CMBrowserPolyChildinstanceC = new CMBrowserPolyChildA("c");
var CMBrowserPolyChildinstanceD = new CMBrowserPolyChildB("d");
var CMBrowserPolyChildinstanceE = new CMBrowserPolyChildA("e");

var CMServerFullrefMonoChildinstanceA = new CMServerFullrefMonoChildA("a");
var CMServerFullrefMonoChildinstanceB = new CMServerFullrefMonoChildB("b");
var CMServerFullrefMonoChildinstanceC = new CMServerFullrefMonoChildA("c");
var CMServerFullrefMonoChildinstanceD = new CMServerFullrefMonoChildB("d");
var CMServerFullrefMonoChildinstanceE = new CMServerFullrefMonoChildA("e");

var CMServerPartialrefMonoChildinstanceA = new CMServerPartialrefMonoChildA("a");
var CMServerPartialrefMonoChildinstanceB = new CMServerPartialrefMonoChildB("b");
var CMServerPartialrefMonoChildinstanceC = new CMServerPartialrefMonoChildA("c");
var CMServerPartialrefMonoChildinstanceD = new CMServerPartialrefMonoChildB("d");
var CMServerPartialrefMonoChildinstanceE = new CMServerPartialrefMonoChildA("e");

var CMServerPartialrefPolyChildinstanceA = new CMServerPartialrefPolyChildA("a");
var CMServerPartialrefPolyChildinstanceB = new CMServerPartialrefPolyChildB("b");
var CMServerPartialrefPolyChildinstanceC = new CMServerPartialrefPolyChildA("c");
var CMServerPartialrefPolyChildinstanceD = new CMServerPartialrefPolyChildB("d");
var CMServerPartialrefPolyChildinstanceE = new CMServerPartialrefPolyChildA("e");

var DNW_IW_ChildinstanceA = new DNW_IW_ChildA("a");
var DNW_IW_ChildinstanceB = new DNW_IW_ChildB("b");
var DNW_IW_ChildinstanceC = new DNW_IW_ChildA("c");
var DNW_IW_ChildinstanceD = new DNW_IW_ChildB("d");
var DNW_IW_ChildinstanceE = new DNW_IW_ChildA("e");

var DNW_FC_ChildinstanceA = new DNW_FC_ChildA("a");
var DNW_FC_ChildinstanceB = new DNW_FC_ChildB("b");
var DNW_FC_ChildinstanceC = new DNW_FC_ChildA("c");
var DNW_FC_ChildinstanceD = new DNW_FC_ChildB("d");
var DNW_FC_ChildinstanceE = new DNW_FC_ChildA("e");

var FiberinstanceA = new FiberChildA("a");
var FiberinstanceB = new FiberChildB("b");
var FiberinstanceC = new FiberChildA("c");
var FiberinstanceD = new FiberChildB("d");
var FiberinstanceE = new FiberChildA("e");

var JohnResiginstanceA = new JRChildA("a");
var JohnResiginstanceB = new JRChildB("b");
var JohnResiginstanceC = new JRChildA("c");
var JohnResiginstanceD = new JRChildB("d");
var JohnResiginstanceE = new JRChildA("e");

var NativeinstanceA = new NativeChildA("a");
var NativeinstanceB = new NativeChildB("b");
var NativeinstanceC = new NativeChildA("c");
var NativeinstanceD = new NativeChildB("d");
var NativeinstanceE = new NativeChildA("e");

var ProtoinstanceA = ProtoChildA("a");
var ProtoinstanceB = ProtoChildB("b");
var ProtoinstanceC = ProtoChildA("c");
var ProtoinstanceD = ProtoChildB("d");
var ProtoinstanceE = ProtoChildA("e");

var modelNames = ["Proto", "TypeScript", "CMServerFullrefMono","CMBrowserPoly","CMServerPartialrefMono","Native","JR","CMServerPartialrefPoly","DNW_IW_","DNW_FC_","Fiber"]
modelNames.forEach(function(name) {
    for (var _i = 0; _i < 10; _i++) {
        var instance1 = new window[name + "ChildA"]("a");
        var instance2 = new window[name + "ChildB"]("b");
        for (var i = 0; i < 50; i++) {
            instance1.method();
            instance2.method();
        }
    }
})
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
TypeScript
var instanceA = TypeScriptinstanceA
var instanceB = TypeScriptinstanceB
var instanceC = TypeScriptinstanceC
var instanceD = TypeScriptinstanceD
var instanceE = TypeScriptinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
Lava ClassManager / Browser / Monomorphic
var instanceA = CMBrowserMonoChildinstanceA
var instanceB = CMBrowserMonoChildinstanceB
var instanceC = CMBrowserMonoChildinstanceC
var instanceD = CMBrowserMonoChildinstanceD
var instanceE = CMBrowserMonoChildinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
Lava ClassManager / Browser / Polymorphic
var instanceA = CMBrowserPolyChildinstanceA
var instanceB = CMBrowserPolyChildinstanceB
var instanceC = CMBrowserPolyChildinstanceC
var instanceD = CMBrowserPolyChildinstanceD
var instanceE = CMBrowserPolyChildinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
Lava ClassManager / Server / Monomorphic / Full
var instanceA = CMServerFullrefMonoChildinstanceA
var instanceB = CMServerFullrefMonoChildinstanceB
var instanceC = CMServerFullrefMonoChildinstanceC
var instanceD = CMServerFullrefMonoChildinstanceD
var instanceE = CMServerFullrefMonoChildinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
Lava ClassManager / Server / Monomorphic / Partial
var instanceA = CMServerPartialrefMonoChildinstanceA
var instanceB = CMServerPartialrefMonoChildinstanceB
var instanceC = CMServerPartialrefMonoChildinstanceC
var instanceD = CMServerPartialrefMonoChildinstanceD
var instanceE = CMServerPartialrefMonoChildinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
Lava ClassManager / Server / Polymorphic / Partial
var instanceA = CMServerPartialrefPolyChildinstanceA
var instanceB = CMServerPartialrefPolyChildinstanceB
var instanceC = CMServerPartialrefPolyChildinstanceC
var instanceD = CMServerPartialrefPolyChildinstanceD
var instanceE = CMServerPartialrefPolyChildinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
DotNetWise inheritWith
var instanceA = DNW_IW_ChildinstanceA
var instanceB = DNW_IW_ChildinstanceB
var instanceC = DNW_IW_ChildinstanceC
var instanceD = DNW_IW_ChildinstanceD
var instanceE = DNW_IW_ChildinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
DotNetWise fastClass
var instanceA = DNW_FC_ChildinstanceA
var instanceB = DNW_FC_ChildinstanceB
var instanceC = DNW_FC_ChildinstanceC
var instanceD = DNW_FC_ChildinstanceD
var instanceE = DNW_FC_ChildinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
Fiber
var instanceA = FiberinstanceA
var instanceB = FiberinstanceB
var instanceC = FiberinstanceC
var instanceD = FiberinstanceD
var instanceE = FiberinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
John Resig's Class
var instanceA = JohnResiginstanceA
var instanceB = JohnResiginstanceB
var instanceC = JohnResiginstanceC
var instanceD = JohnResiginstanceD
var instanceE = JohnResiginstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
Native
var instanceA = NativeinstanceA
var instanceB = NativeinstanceB
var instanceC = NativeinstanceC
var instanceD = NativeinstanceD
var instanceE = NativeinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready
Proto
var instanceA = ProtoinstanceA
var instanceB = ProtoinstanceB
var instanceC = ProtoinstanceC
var instanceD = ProtoinstanceD
var instanceE = ProtoinstanceE
for (var i = 0; i < 100000; i++) {
    instanceA.method();
    instanceB.method();
    instanceC.method();
    instanceD.method();
    instanceE.method();
}
ready

Revisions

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

  • Revision 2: published by kogarashisan1 on
  • Revision 3: published by kogarashisan1 on
  • Revision 4: published by Billy Tetrud on
  • Revision 5: published by Billy Tetrud on
  • Revision 6: published by Billy Tetrud on
  • Revision 7: published by kogarashisan1 on
  • Revision 9: published by Aadit M Shah on
  • Revision 10: published by kogarashisan1 on
  • Revision 11: published by Enzo on
  • Revision 12: published by kogarashisan1 on