data-storage (v3)

Revision 3 of this benchmark created by galambalazs on


Preparation HTML

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

<div id="root"></div>
<script>
 // fallback for older browsers
 if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(item) {
   var len = this.length >>> 0;
   for (var i = 0; i < len; i++) {
    if (this[i] === item) {
     return i;
    }
   }
   return -1;
  };
 }
 
 // array version
 var data = (function() {
  var elements = [];
  var storage = [];
  return function(el, key, value) {
   var i = elements.indexOf(el);
   if (typeof value != "undefined") {
    if (i == -1) {
     i = elements.length;
     elements[i] = el;
     storage[i] = {};
    }
    storage[i][key] = value; // set
   } else if (storage[i]) {
    return storage[i][key]; // get
   }
  };
 })();
 
 // hash table version
 var data2 = (function() {
  var storage = {};
  var counter = 1;
  return function(el, key, value) {
   var uid = el.uniqueID || (el.uniqueID = counter++);
   if (typeof value != "undefined") {
    storage[uid] || (storage[uid] = {});
    storage[uid][key] = value; // set
   } else if (storage[uid]) {
    return storage[uid][key]; // get
   }
  };
 })();
 
 ////////////////////////////////////
 // Create test page
 var MAXDEPTH = 2;
 var dummy = document.createElement("div");
 var total = 0;
 
 function createBranch(root, depth) {
  depth = depth ? depth + 1 : 1;
  for (var i = 0; i < 10; i++) {
   total++;
   var el = dummy.cloneNode(false);
   el.id = "elem" + total;
   root.appendChild(el);
   if (depth < MAXDEPTH) {
    createBranch(el, depth);
   }
  }
 }
 
 ////////////////////////////////////
 // Initialize tests     
 var root = document.getElementById("root");
 createBranch(root);
 var elems = root.getElementsByTagName("div");
 var len = elems.length;
 var ret;
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
jQuery
for (var i = len; i--;) {
 jQuery.data(elems[i], "custom" + i, "custom" + i);
 ret = jQuery.data(elems[i], "custom" + i);
}
ready
custom
for (var i = len; i--;) {
 data(elems[i], "custom" + i, "custom" + i);
 ret = data(elems[i], "custom" + i);
}
ready
custom2
for (var i = len; i--;) {
 data2(elems[i], "custom" + i, "custom" + i);
 ret = data2(elems[i], "custom" + i);
}
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
  • Revision 3: published by galambalazs on