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
Source: http://dhtmlkitchen.com/jstest/scope-chain-performance-iframe.html
<script>
// http://dhtmlkitchen.com/jstest/scope-chain-performance-iframe.html
// http://dhtmlkitchen.com/jstest/variable-performance.html
var testCreated = false;
var iframe;
// instead of fdoc.clear()
// http://msdn.microsoft.com/en-us/library/ms536361(VS.85).aspx
function clearDocument(doc) {
doc.open();
doc.write("");
doc.close();
}
function createTest() {
var f = document.createElement("iframe");
f.src = "about:blank";
f.id = "iframe";
f.style.display = "none";
iframe = f;
document.body.insertBefore(f, document.body.firstChild);
var fwin = f.contentWindow,
fdoc = fwin.document;
//fdoc.clear();
clearDocument(fdoc)
fdoc.open();
var rows = [],
rows2 = [],
rows3 = [],
rows4 = [],
rows5 = [],
rowsRead = [],
rowsObjAssign = [],
cols = [],
cols2 = [],
cols3 = [],
cols4 = [],
cols5 = [],
colsRead = [],
colsObjAssign = [],
c = 0,
t, rn, rAssign, MAX = 14000,
ROW_SIZE = 1000,
PRIME = 1011001110001111,
pad = "";
function generateRandomNumber() {
return Math.round(Math.random() * PRIME);
}
for (var i = 0; i < MAX; i += ROW_SIZE) {
rows[i] = "var ";
rows2[i] = rows3[i] = rows4[i] = rows5[i] =
rowsRead[i] = " var ";
for (var j = 0; j < ROW_SIZE; j++) {
c = i + j;
rn = "r" + c;
ln = "p" + c;
rAssign = rn + " = ";
lAssign = ln + " = " + rn;
cols[j] = rAssign + generateRandomNumber();
cols2[j] = rAssign + generateRandomNumber();
cols3[j] = rAssign + generateRandomNumber();
cols4[j] = rAssign + generateRandomNumber();
cols5[j] = rAssign + generateRandomNumber();
colsRead[j] = lAssign;
colsObjAssign[j] = "obj." + rAssign + generateRandomNumber();
}
rows[i] += cols + ";\n";
rows2[i] += pad + cols2 + ";\n";
rows3[i] += pad + cols3 + ";\n";
rows4[i] += pad + cols4 + ";\n";
rows5[i] += pad + cols5 + ";\n";
rowsRead[i] += pad + colsRead + ";\n";
rowsObjAssign[i] = " " + colsObjAssign.join(";") + ";\n";
pad = " ";
}
var rVars = rows.join("");
var r2Vars = rows2.join("");
var r3Vars = rows3.join("");
var r4Vars = rows4.join("");
var r5Vars = rows5.join("");
var closureVars = rowsRead.join("");
var rAssignments = rVars.replace(/var /mg, "");
var r2Assignments = r2Vars.replace(/var /mg, "");
var r3Assignments = r3Vars.replace(/var /mg, " ");
var r4Assignments = r4Vars.replace(/var /mg, " ");
var r5Assignments = r5Vars.replace(/var /mg, " ");
var objAssigments = rowsObjAssign.join("");
fdoc.write("<script type='text/javascript'>\n");
fdoc.write(rVars);
fdoc.write("/* assign to global var */");
fdoc.write("\nfunction testGlobalAssign(){\n");
fdoc.write(r2Assignments);
fdoc.write("}\n");
fdoc.write("/* read global var */");
fdoc.write("\nfunction testGlobalRead(){\n");
fdoc.write(closureVars);
fdoc.write("}\n");
fdoc.write("/* assign to local var. */");
fdoc.write("\nfunction testLocalAssign(){\n");
fdoc.write(r3Vars);
fdoc.write("}\n");
fdoc.write("/* Declare and subsequently read local var. */");
fdoc.write("\nfunction testLocalRead(){\n");
fdoc.write(r3Vars);
fdoc.write(closureVars);
fdoc.write("}\n");
fdoc.write("/* assign value to var in enclosing scope */");
fdoc.write("\nvar testClosureAssign = (function(){\n");
fdoc.write(r4Vars);
fdoc.write("\n function nested(){\n");
fdoc.write(r4Assignments);
fdoc.write(" }");
fdoc.write("\n return nested;\n");
fdoc.write("})();\n");
fdoc.write("/* read value of var in enclosing scope */");
fdoc.write("\nvar testClosureRead = (function(){\n");
fdoc.write(r4Vars);
fdoc.write("\n function nestedRead(){\n");
fdoc.write(closureVars);
fdoc.write(" }");
fdoc.write("\n return nestedRead;\n");
fdoc.write("})();\n");
fdoc.write("/* assign value to global var from nested scope */");
fdoc.write("\nvar testClosureToGlobalAssign = (function(){\n");
fdoc.write(" function nestedToGlobalAssign(){\n");
fdoc.write(r5Assignments);
fdoc.write("\n }");
fdoc.write("\n return nestedToGlobalAssign;\n");
fdoc.write("})();\n");
fdoc.write("/* read value from global var from nested scope */");
fdoc.write("\nvar testClosureToGlobalRead = (function(){\n");
fdoc.write("\n function nestedGlobalRead(){\n");
fdoc.write(closureVars);
fdoc.write(" }");
fdoc.write("\n return nestedGlobalRead;\n");
fdoc.write("})();\n");
fdoc.write("/* set property of object in scope. */");
fdoc.write("\nvar globalObj = {};\n");
fdoc.write("\nfunction testObjPropertyAssign(){\n");
fdoc.write(" var obj = globalObj;\n");
fdoc.write(objAssigments);
fdoc.write("}\n");
fdoc.write("/* create and a property of an object. */");
fdoc.write("\nfunction testObjCreate(){\n");
fdoc.write(" var obj = {};\n");
fdoc.write(objAssigments);
fdoc.write("}\n");
fdoc.write("<\/script>");
fdoc.close();
testCreated = true;
}
function test(name) {
if (!testCreated) {
createTest();
}
iframe.contentWindow[name]();
}
</script>
Ready to run.
Test | Ops/sec | |
---|---|---|
GlobalAssign |
| ready |
LocalAssign |
| ready |
ClosureAssign |
| ready |
ClosureToGlobalAssign |
| ready |
GlobalRead |
| ready |
LocalRead |
| ready |
ClosureRead |
| ready |
ClosureToGlobalRead |
| ready |
ObjPropertyAssign |
| ready |
ObjCreate |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.