scope chain performance

Benchmark created by galambalazs on


Description

Source: http://dhtmlkitchen.com/jstest/scope-chain-performance-iframe.html

Preparation 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>

Test runner

Ready to run.

Testing in
TestOps/sec
GlobalAssign
test('testGlobalAssign');
ready
LocalAssign
test('testLocalAssign');
ready
ClosureAssign
test('testClosureAssign');
ready
ClosureToGlobalAssign
test('testClosureToGlobalAssign');
ready
GlobalRead
test('testGlobalRead');
ready
LocalRead
test('testLocalRead');
ready
ClosureRead
test('testClosureRead');
ready
ClosureToGlobalRead
test('testClosureToGlobalRead');
ready
ObjPropertyAssign
test('testObjPropertyAssign');
ready
ObjCreate
test('testObjCreate');
ready

Revisions

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

  • Revision 1: published by galambalazs on