Functionsss

JavaScript performance comparison

Test case created

Preparation code

 
<script>
Benchmark.prototype.setup = function() {
    var arr1 = new Array(100);
    var arr2 = new Array(100);
   
    function Type1(a, b) {
        this.a = a;
        this.b = b;
    }
   
    Type1.prototype.stuff = function () {
        this.a += this.b;
        return this.a;
    }
   
    function Type2(a, b) {
        this.a = a;
        this.b = b;
    }
   
    Type2.prototype.stuff = function () {
        this.b += this.a;
        return this.b;
    }
   
    function init1() {
        var j, k;
        for (j = 0; j < 100; ++j) {
                var v = [];
                var num = j % 2;
   
                if (num < 1) {
                        for (k = 0; k < 100; ++k) {
                                v[k] = new Type1(Math.random(), Math.random());
                        }
                } else {
                        for (k = 0; k < 100; ++k) {
                                v[k] = new Type2(Math.random(), Math.random());
                        }
                }
                arr1[j] = v;
        }
    }
   
    var Type1_instance = { stuff: function (v) { v.a += v.b; return v.a; } };
    var Type2_instance = { stuff: function (v) { v.b += v.a; return v.b; } };
   
    function init2() {
        var j, k;
        for (j = 0; j < 100; ++j) {
                var v = [], ci;
                var num = j % 2;
                if (num < 1) {
                        for (k = 0; k < 100; ++k) {
                                v[k] = { a: Math.random(), b: Math.random() };
                        }
                        ci = Type1_instance;
                } else {
                        for (k = 0; k < 100; ++k) {
                                v[k] = { a: Math.random(), b: Math.random() };
                        }
                        ci = Type2_instance;
                }
                arr2[j] = { arr: v, ci: ci };
        }
    }
   
    function stufftwice1(v) {
        var x = v.stuff();
        return x + v.stuff();
    }
   
    function stufftwice2(v, ci) {
        var x = ci.stuff(v);
        return x + ci.stuff(v);
    }
   
    function stufftwice3(v, stuff) {
        var x = stuff(v);
        return x + stuff(v);
    }
   
    init1();
    init2();
};
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
Prototype
var s = 0;

for (var j = 0; j < 100; ++j) {
        var a = arr1[j];
        for (var k = 0; k < 100; ++k) {
                s += stufftwice1(a[k]);
        }
}

console.log(s);
pending…
Dictionary
var s = 0;

for (var j = 0; j < 100; ++j) {
        var ao = arr2[j];
        var a = ao.arr;
        var ci = ao.ci;
        for (var k = 0; k < 100; ++k) {
                s += stufftwice2(a[k], ci);
        }
}

console.log(s);
pending…
Dictionary flattened
var s = 0;

for (var j = 0; j < 100; ++j) {
        var ao = arr2[j];
        var a = ao.arr;
        var stuff = ao.ci.stuff;
        for (var k = 0; k < 100; ++k) {
                s += stufftwice3(a[k], stuff);
        }
}

console.log(s);
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment