Performance Suite Test Script to test !.8.5 Spidermonkey
Posted: Mon Jul 28, 2025 5:22 am
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. =====");
}
{
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. =====");
}