AngularJS/Lodash(underscore) foreach (v9)

Revision 9 of this benchmark created on


Preparation HTML

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.3/angular.min.js">
</script>

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.2.1/lodash.min.js"></script>



<script>
  // Production steps of ECMA-262, Edition 5, 15.4.4.18
  // Reference: http://es5.github.com/#x15.4.4.18
  if (!Array.prototype.shimForEach) {

    Array.prototype.shimForEach = function forEach(callback, thisArg) {

      var T, k;

      if (this == null) {
        throw new TypeError("this is null or not defined");
      }

      // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
      var O = Object(this);

      // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
      // 3. Let len be ToUint32(lenValue).
      var len = O.length >>> 0; // Hack to convert O.length to a UInt32
      // 4. If IsCallable(callback) is false, throw a TypeError exception.
      // See: http://es5.github.com/#x9.11
      if ({}.toString.call(callback) !== "[object Function]") {
        throw new TypeError(callback + " is not a function");
      }

      // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
      if (thisArg) {
        T = thisArg;
      }

      // 6. Let k be 0
      k = 0;

      // 7. Repeat, while k < len
      while (k < len) {

        var kValue;

        // a. Let Pk be ToString(k).
        //   This is implicit for LHS operands of the in operator
        // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
        //   This step can be combined with c
        // c. If kPresent is true, then
        if (Object.prototype.hasOwnProperty.call(O, k)) {

          // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
          kValue = O[k];

          // ii. Call the Call internal method of callback with T as the this value and
          // argument list containing kValue, k, and O.
          callback.call(T, kValue, k, O);
        }
        // d. Increase k by 1.
        k++;
      }
      // 8. return undefined
    };
  }
</script>

Setup

var _ = window._;
    var angular = window.angular;
    var arr = Array(1e3);
    for (var i = 0; i < 1e3; i++) {
      arr[i] = i;
    }
    
    var sum = 0;
    
    function forfn(arr, fn) {
      var i, len = arr.length;
      for (i = 0; i < len; ++i) {
        fn(arr[i]);
      }
    }

Test runner

Ready to run.

Testing in
TestOps/sec
AngularJS
angular.forEach(arr, function(i) {
  sum += i;
});
ready
Lodash
_.each(arr, function(i) {
  sum += i;
});
ready
Native
arr.forEach(function(i) {
  sum += i;
});
ready
For (anonymous)
for (var i = 0, j = arr.length; i < j; i++) {
  (function() {
    sum += arr[i]
  })();
}
ready
Shim For Each
arr.shimForEach(function(i) {
  sum += 1;
});
ready
forfn
forfn(arr, function(i) {
  sum += i;
});
ready
rawfor
var i, len = arr.length;
for (i = 0; i < len; ++i) {
  sum += arr[i];
}
ready
every
arr.every(function(i) {
  sum += i;
  return true;
});
ready

Revisions

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