SteelToe vs try vs checks

Benchmark created by Sergey on


Preparation HTML

<div id="nochildren">
</div>

Setup

function steelToe(object) {
      function _steelToe(property) {
        if (object && property) {
          return steelToe(object[property]);
        } else {
          return property ? steelToe() : object;
        }
      }
    
      _steelToe.set = function(traversalChain, value) {
        var keys = traversalChain.split('.'),
            object = _steelToe;
    
        for (var i = 0; i < keys.length; i++) {
          if (!object()[keys[i]]) {
            object()[keys[i]] = {};
          }
    
          if (i == keys.length - 1) {
            object()[keys[i]] = value;
          }
    
          object = object(keys[i]);
        }
    
        return value;
      }
    
      _steelToe.walk = function(traversalChain) {
        if (traversalChain) {
          var keys = traversalChain.split('.'),
              returnObject = _steelToe,
              i;
    
          for (i = 0; i < keys.length; i += 1) {
            returnObject = returnObject(keys[i])
          }
    
          return returnObject();
        } else {
          return _steelToe();
        }
      };
    
      return _steelToe;
    };
    
    var template = '{"father": {"info": {"name": "Brad1", "children": "' + Math.round(Math.random() * 11) + '"}}}',
        families = [],
        obj, nochildren = 0;
    
    for (var i = 0; i < 100000; i++) {
      obj = JSON.parse(template);
      if (Math.round(Math.random() * 11) == Math.round(Math.random() * 11)) {
        delete obj.children;
        nochildren++;
      }
      families.push(obj);
    };
    
    document.getElementById('nochildren').innerHTML = 'nochildren times:' + nochildren;

Test runner

Ready to run.

Testing in
TestOps/sec
check
var kids = [];

for (var i = 0, il = families.length; i < il; i++) {
  var father = families[i].father;

  if (father && father.info && father.info.children) {
    kids.push(father.info.children);
  }
}
ready
SteelToe
var kids = [];

for (var i = 0, il = families.length; i < il; i++) {
  var children = steelToe(families[i]).walk('father.info.children');

  if (children) {
    kids.push(children);
  }
}
ready
try-catch
var kids = [];
for (var i = 0, il = families.length; i < il; i++) {
  var children;
  try {
    children = families[i].father.info.children;
  } catch (e) {}
  if (children) {
    kids.push(children);
  }
}
ready

Revisions

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

  • Revision 1: published by Sergey on