Angular forEach vs. Native for loop vs. Lodash (v113)

Revision 113 of this benchmark created by Chris Gruel on


Description

Updated to latest Angular 1.3 and latest Lodash 3.5

Preparation HTML

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>

Setup

var __ = {
      forEachRight: function (obj, callback) {
        for (i = obj.length - 1; i >= 0; i--) {
          callback(obj[i]);
        }
      }
    };
    
    var dataset, i, retObj = {}, stats = [{
        "window": "lifetime",
        "source": "DX",
        "spend": "1642.81",
        "ideal_spend": "2989.86",
        "pace": "43",
        "impressions": "224929",
        "actions": "189",
        "cpm": "3.90",
        "ideal_cpm": "2.81",
        "cpa": "25.82"
      }, {
        "window": "yesterday",
        "source": "DX",
        "spend": "1634.57",
        "ideal_spend": "3276.75",
        "pace": "24",
        "impressions": "24771",
        "actions": "41",
        "cpm": "2.08",
        "ideal_cpm": "3.14",
        "cpa": "16.00"
      }];

Test runner

Ready to run.

Testing in
TestOps/sec
Angular forEach
angular.forEach(stats, function(dataset) {
  if (dataset.window && dataset.window === 'lifetime') {
    delete dataset.window;
    retObj = dataset;
  }
});
ready
Native For Right
for (i = stats.length - 1; i >= 0; i--) {
  dataset = stats[i];
  if (dataset.window && dataset.window === 'lifetime') {
    delete dataset.window;
    retObj = dataset;
  }
}
ready
Lodash forEachRight
_.forEachRight(stats, function(dataset) {
  if (dataset.window && dataset.window === 'lifetime') {
    delete dataset.window;
    retObj = dataset;
  }
});
ready
Custom
__.forEachRight(stats, function(dataset) {
  if (dataset.window && dataset.window === 'lifetime') {
    delete dataset.window;
    retObj = dataset;
  }
});
ready
ES5 forEach
stats.forEach(function(dataset) {
  if (dataset.window && dataset.window === 'lifetime') {
    delete dataset.window;
    retObj = dataset;
  }
});
ready
Lodash forEachLeft
_.forEach(stats, function(dataset) {
  if (dataset.window && dataset.window === 'lifetime') {
    delete dataset.window;
    retObj = dataset;
  }
});
ready
Native For Left
for (i = 0; i < stats.length; i++) {
  var dataset = stats[i];
  if (dataset.window && dataset.window === 'lifetime') {
    delete dataset.window;
    retObj = dataset;
  }
}
ready
for loop, super-cached i and stats length, simpler!
var i,len = stats.length;
for (i = 0; i < len; i++) {
  var d = stats[i],dw = d.window || 0;
  if (dw && dw === 'lifetime') {
    delete dw;
    retObj = d;
  }
}
ready
for loop, super-cached i and stats length, simpler 2
var i,len = stats.length, d, dw;
for (i = 0; i < len; i++) {
  d = stats[i],dw = d.window || 0;
  if (dw && dw === 'lifetime') {
    delete dw;
    retObj = d;
  }
}
ready

Revisions

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