Performance Suite Test Script to test !.8.5 Spidermonkey

Got any custom JavaScript additions/tweaks you think other people would like to see? Post 'em here!
Post Reply
dragon slayer
UOX3 Guru
Posts: 776
Joined: Thu Dec 21, 2006 7:37 am
Has thanked: 4 times
Been thanked: 26 times

Performance Suite Test Script to test !.8.5 Spidermonkey

Post by dragon slayer »

function PerformanceSuite()
{
    Console.Warning("===== UOX3 SpiderMonkey 1.8.5 Performance Suite =====");

    function bench(label, fn)
    {
        let t1 = Date.now();
        let result = fn();
        let t2 = Date.now();
        Console.Warning(label + " took " + (t2 - t1) + "ms | result: " + result);
    }

    // General Engine Tests
    bench("Arithmetic Test", function() {
        let x = 0;
        for (let i = 0; i < 1e7; i++)
            x += (i * 3) / (i + 1);
        return x;
    });

    bench("String Concat (+)", function() {
        let str = "";
        for (let i = 0; i < 10000; i++)
            str += "abc";
        return str.length;
    });

    bench("Array.join Concat", function() {
        let arr = [];
        for (let i = 0; i < 10000; i++)
            arr.push("abc");
        return arr.join("").length;
    });

    bench("Object Property Access", function() {
        let obj = {};
        for (let i = 0; i < 100000; i++)
            obj["key" + i] = i;
        return obj["key99999"];
    });

    bench("Closure Creation", function() {
        let funcs = [];
        for (let i = 0; i < 50000; i++)
            funcs.push((function(x){ return function() { return x; }; })(i));
        return funcs[49999]();
    });

    bench("Scope Chain Resolution", function() {
        let a = 1, b = 2, c = 3;
        function deep() { return a + b + c; }
        let sum = 0;
        for (let i = 0; i < 1e6; i++)
            sum += deep();
        return sum;
    });

    bench("Array Allocation", function() {
        let arr = new Array(100000);
        for (let i = 0; i < arr.length; i++)
            arr[i] = i;
        let sum = 0;
        for (let i = 0; i < arr.length; i++)
            sum += arr[i];
        return sum;
    });

    bench("Garbage Collection Test", function() {
        let garbage = [];
        for (let i = 0; i < 100000; i++)
            garbage.push({ val: i });
        return garbage.length;
    });

    bench("Prototype Chain Test", function() {
        let base = { x: 1 };
        let mid = Object.create(base);
        let obj = Object.create(mid);
        let sum = 0;
        for (let i = 0; i < 1e6; i++)
            sum += obj.x;
        return sum;
    });

    bench("for..in Enumeration", function() {
        let obj = {};
        for (let i = 0; i < 10000; i++)
            obj["k" + i] = i;
        let sum = 0;
        for (let key in obj)
            sum += obj[key];
        return sum;
    });

    bench("Array vs Object Access", function() {
        let arr = [], obj = {};
        for (let i = 0; i < 100000; i++)
        {
            arr[i] = i;
            obj["k" + i] = i;
        }
        let t1 = Date.now();
        let sum1 = 0;
        for (let i = 0; i < 100000; i++) sum1 += arr[i];
        let t2 = Date.now();
        let sum2 = 0;
        for (let i = 0; i < 100000; i++) sum2 += obj["k" + i];
        let t3 = Date.now();
        Console.Warning("  > Array access: " + (t2 - t1) + "ms, Object access: " + (t3 - t2) + "ms");
        return sum1 + sum2;
    });

    // NanoJIT Inference Tests
    Console.Warning("=== NanoJIT Inference Tests ===");

    bench("Hot Loop (JIT Trigger)", function() {
        let sum = 0;
        for (let j = 0; j < 3; j++) {
            for (let i = 0; i < 1e7; i++)
                sum += i;
        }
        return sum;
    });

    bench("Type Instability Loop", function() {
        let x;
        for (let i = 0; i < 1e6; i++)
            x = (i % 2 === 0) ? 5 : "string";
        return x;
    });

    bench("Side Exit Pattern", function() {
        let val = true;
        let sum = 0;
        for (let i = 0; i < 1e6; i++) {
            if (val)
                sum += i;
            else
                sum -= i;
        }
        return sum;
    });

    bench("Recursive Function", function() {
        function fib(n) {
            return n <= 1 ? n : fib(n - 1) + fib(n - 2);
        }
        return fib(15);
    });

    bench("Loop Invariant Math", function() {
        let x = 0, c = Math.cos(0.5);
        for (let i = 0; i < 1e6; i++)
            x += c;
        return x;
    });

    bench("Loop with Math Inside", function() {
        let x = 0;
        for (let i = 0; i < 1e6; i++)
            x += Math.cos(0.5);
        return x;
    });

    Console.Warning("===== All tests completed. =====");
}
Post Reply