array splice vs. underscore

Benchmark created by Cesar Canassa on


Description

Split an Array into chunks. Pure-javascript solution vs. Underscore.

Preparation HTML

<script src="https://raw.github.com/andrewplummer/Sugar/master/release/sugar-1.1.3.min.js" type="text/javascript"></script>

<script>
  // Underscore.js 1.2.3
  // (c) 2009-2011 Jeremy Ashkenas, DocumentCloud Inc.
  // Underscore is freely distributable under the MIT license.
  // Portions of Underscore are inspired or borrowed from Prototype,
  // Oliver Steele's Functional, and John Resig's Micro-Templating.
  // For all details and documentation:
  // http://documentcloud.github.com/underscore
  (function() {
    function r(a, c, d) {
      if (a === c) return a !== 0 || 1 / a == 1 / c;
      if (a == null || c == null) return a === c;
      if (a._chain) a = a._wrapped;
      if (c._chain) c = c._wrapped;
      if (a.isEqual && b.isFunction(a.isEqual)) return a.isEqual(c);
      if (c.isEqual && b.isFunction(c.isEqual)) return c.isEqual(a);
      var e = l.call(a);
      if (e != l.call(c)) return false;
      switch (e) {
      case "[object String]":
        return a == String(c);
      case "[object Number]":
        return a != +a ? c != +c : a == 0 ? 1 / a == 1 / c : a == +c;
      case "[object Date]":
      case "[object Boolean]":
        return +a == +c;
      case "[object RegExp]":
        return a.source == c.source && a.global == c.global && a.multiline == c.multiline && a.ignoreCase == c.ignoreCase
      }
      if (typeof a != "object" || typeof c != "object") return false;
      for (var f = d.length; f--;) if (d[f] == a) return true;
      d.push(a);
      var f = 0,
          g = true;
      if (e == "[object Array]") {
        if (f = a.length, g = f == c.length) for (; f--;) if (!(g = f in a == f in c && r(a[f], c[f], d))) break
      } else {
        if ("constructor" in a != "constructor" in c || a.constructor != c.constructor) return false;
        for (var h in a) if (m.call(a, h) && (f++, !(g = m.call(c, h) && r(a[h], c[h], d)))) break;
        if (g) {
          for (h in c) if (m.call(c, h) && !f--) break;
          g = !f
        }
      }
      d.pop();
      return g
    }
    var s = this,
        F = s._,
        o = {},
        k = Array.prototype,
        p = Object.prototype,
        i = k.slice,
        G = k.concat,
        H = k.unshift,
        l = p.toString,
        m = p.hasOwnProperty,
        v = k.forEach,
        w = k.map,
        x = k.reduce,
        y = k.reduceRight,
        z = k.filter,
        A = k.every,
        B = k.some,
        q = k.indexOf,
        C = k.lastIndexOf,
        p = Array.isArray,
        I = Object.keys,
        t = Function.prototype.bind,
        b = function(a) {
        return new n(a)
        };
    if (typeof exports !== "undefined") {
      if (typeof module !== "undefined" && module.exports) exports = module.exports = b;
      exports._ = b
    } else typeof define === "function" && define.amd ? define("underscore", function() {
      return b
    }) : s._ = b;
    b.VERSION = "1.2.3";
    var j = b.each = b.forEach = function(a, c, b) {
        if (a != null) if (v && a.forEach === v) a.forEach(c, b);
        else if (a.length === +a.length) for (var e = 0, f = a.length; e < f; e++) {
          if (e in a && c.call(b, a[e], e, a) === o) break
        } else for (e in a) if (m.call(a, e) && c.call(b, a[e], e, a) === o) break
        };
    b.map = function(a, c, b) {
      var e = [];
      if (a == null) return e;
      if (w && a.map === w) return a.map(c, b);
      j(a, function(a, g, h) {
        e[e.length] = c.call(b, a, g, h)
      });
      return e
    };
    b.reduce = b.foldl = b.inject = function(a, c, d, e) {
      var f = arguments.length > 2;
      a == null && (a = []);
      if (x && a.reduce === x) return e && (c = b.bind(c, e)), f ? a.reduce(c, d) : a.reduce(c);
      j(a, function(a, b, i) {
        f ? d = c.call(e, d, a, b, i) : (d = a, f = true)
      });
      if (!f) throw new TypeError("Reduce of empty array with no initial value");
      return d
    };
    b.reduceRight = b.foldr = function(a, c, d, e) {
      var f = arguments.length > 2;
      a == null && (a = []);
      if (y && a.reduceRight === y) return e && (c = b.bind(c, e)), f ? a.reduceRight(c, d) : a.reduceRight(c);
      var g = b.toArray(a).reverse();
      e && !f && (c = b.bind(c, e));
      return f ? b.reduce(g, c, d, e) : b.reduce(g, c)
    };
    b.find = b.detect = function(a, c, b) {
      var e;
      D(a, function(a, g, h) {
        if (c.call(b, a, g, h)) return e = a, true
      });
      return e
    };
    b.filter = b.select = function(a, c, b) {
      var e = [];
      if (a == null) return e;
      if (z && a.filter === z) return a.filter(c, b);
      j(a, function(a, g, h) {
        c.call(b, a, g, h) && (e[e.length] = a)
      });
      return e
    };
    b.reject = function(a, c, b) {
      var e = [];
      if (a == null) return e;
      j(a, function(a, g, h) {
        c.call(b, a, g, h) || (e[e.length] = a)
      });
      return e
    };
    b.every = b.all = function(a, c, b) {
      var e = true;
      if (a == null) return e;
      if (A && a.every === A) return a.every(c, b);
      j(a, function(a, g, h) {
        if (!(e = e && c.call(b, a, g, h))) return o
      });
      return e
    };
    var D = b.some = b.any = function(a, c, d) {
        c || (c = b.identity);
        var e = false;
        if (a == null) return e;
        if (B && a.some === B) return a.some(c, d);
        j(a, function(a, b, h) {
          if (e || (e = c.call(d, a, b, h))) return o
        });
        return !!e
        };
    b.include = b.contains = function(a, c) {
      var b = false;
      if (a == null) return b;
      return q && a.indexOf === q ? a.indexOf(c) != -1 : b = D(a, function(a) {
        return a === c
      })
    };
    b.invoke = function(a, c) {
      var d = i.call(arguments, 2);
      return b.map(a, function(a) {
        return (c.call ? c || a : a[c]).apply(a, d)
      })
    };
    b.pluck = function(a, c) {
      return b.map(a, function(a) {
        return a[c]
      })
    };
    b.max = function(a, c, d) {
      if (!c && b.isArray(a)) return Math.max.apply(Math, a);
      if (!c && b.isEmpty(a)) return -Infinity;
      var e = {
        computed: -Infinity
      };
      j(a, function(a, b, h) {
        b = c ? c.call(d, a, b, h) : a;
        b >= e.computed && (e = {
          value: a,
          computed: b
        })
      });
      return e.value
    };
    b.min = function(a, c, d) {
      if (!c && b.isArray(a)) return Math.min.apply(Math, a);
      if (!c && b.isEmpty(a)) return Infinity;
      var e = {
        computed: Infinity
      };
      j(a, function(a, b, h) {
        b = c ? c.call(d, a, b, h) : a;
        b < e.computed && (e = {
          value: a,
          computed: b
        })
      });
      return e.value
    };
    b.shuffle = function(a) {
      var c = [],
          b;
      j(a, function(a, f) {
        f == 0 ? c[0] = a : (b = Math.floor(Math.random() * (f + 1)), c[f] = c[b], c[b] = a)
      });
      return c
    };
    b.sortBy = function(a, c, d) {
      return b.pluck(b.map(a, function(a, b, g) {
        return {
          value: a,
          criteria: c.call(d, a, b, g)
        }
      }).sort(function(a, c) {
        var b = a.criteria,
            d = c.criteria;
        return b < d ? -1 : b > d ? 1 : 0
      }), "value")
    };
    b.groupBy = function(a, c) {
      var d = {},
          e = b.isFunction(c) ? c : function(a) {
          return a[c]
          };
      j(a, function(a, b) {
        var c = e(a, b);
        (d[c] || (d[c] = [])).push(a)
      });
      return d
    };
    b.sortedIndex = function(a, c, d) {
      d || (d = b.identity);
      for (var e = 0, f = a.length; e < f;) {
        var g = e + f >> 1;
        d(a[g]) < d(c) ? e = g + 1 : f = g
      }
      return e
    };
    b.toArray = function(a) {
      return !a ? [] : a.toArray ? a.toArray() : b.isArray(a) ? i.call(a) : b.isArguments(a) ? i.call(a) : b.values(a)
    };
    b.size = function(a) {
      return b.toArray(a).length
    };
    b.first = b.head = function(a, b, d) {
      return b != null && !d ? i.call(a, 0, b) : a[0]
    };
    b.initial = function(a, b, d) {
      return i.call(a, 0, a.length - (b == null || d ? 1 : b))
    };
    b.last = function(a, b, d) {
      return b != null && !d ? i.call(a, Math.max(a.length - b, 0)) : a[a.length - 1]
    };
    b.rest = b.tail = function(a, b, d) {
      return i.call(a, b == null || d ? 1 : b)
    };
    b.compact = function(a) {
      return b.filter(a, function(a) {
        return !!a
      })
    };
    b.flatten = function(a, c) {
      return b.reduce(a, function(a, e) {
        if (b.isArray(e)) return a.concat(c ? e : b.flatten(e));
        a[a.length] = e;
        return a
      }, [])
    };
    b.without = function(a) {
      return b.difference(a, i.call(arguments, 1))
    };
    b.uniq = b.unique = function(a, c, d) {
      var d = d ? b.map(a, d) : a,
          e = [];
      b.reduce(d, function(d, g, h) {
        if (0 == h || (c === true ? b.last(d) != g : !b.include(d, g))) d[d.length] = g, e[e.length] = a[h];
        return d
      }, []);
      return e
    };
    b.union = function() {
      return b.uniq(b.flatten(arguments, true))
    };
    b.intersection = b.intersect = function(a) {
      var c = i.call(arguments, 1);
      return b.filter(b.uniq(a), function(a) {
        return b.every(c, function(c) {
          return b.indexOf(c, a) >= 0
        })
      })
    };
    b.difference = function(a) {
      var c = b.flatten(i.call(arguments, 1));
      return b.filter(a, function(a) {
        return !b.include(c, a)
      })
    };
    b.zip = function() {
      for (var a = i.call(arguments), c = b.max(b.pluck(a, "length")), d = Array(c), e = 0; e < c; e++) d[e] = b.pluck(a, "" + e);
      return d
    };
    b.indexOf = function(a, c, d) {
      if (a == null) return -1;
      var e;
      if (d) return d = b.sortedIndex(a, c), a[d] === c ? d : -1;
      if (q && a.indexOf === q) return a.indexOf(c);
      for (d = 0, e = a.length; d < e; d++) if (d in a && a[d] === c) return d;
      return -1
    };
    b.lastIndexOf = function(a, b) {
      if (a == null) return -1;
      if (C && a.lastIndexOf === C) return a.lastIndexOf(b);
      for (var d = a.length; d--;) if (d in a && a[d] === b) return d;
      return -1
    };
    b.range = function(a, b, d) {
      arguments.length <= 1 && (b = a || 0, a = 0);
      for (var d = arguments[2] || 1, e = Math.max(Math.ceil((b - a) / d), 0), f = 0, g = Array(e); f < e;) g[f++] = a, a += d;
      return g
    };
    var E = function() {};
    b.bind = function(a, c) {
      var d, e;
      if (a.bind === t && t) return t.apply(a, i.call(arguments, 1));
      if (!b.isFunction(a)) throw new TypeError;
      e = i.call(arguments, 2);
      return d = function() {
        if (!(this instanceof d)) return a.apply(c, e.concat(i.call(arguments)));
        E.prototype = a.prototype;
        var b = new E,
            g = a.apply(b, e.concat(i.call(arguments)));
        return Object(g) === g ? g : b
      }
    };
    b.bindAll = function(a) {
      var c = i.call(arguments, 1);
      c.length == 0 && (c = b.functions(a));
      j(c, function(c) {
        a[c] = b.bind(a[c], a)
      });
      return a
    };
    b.memoize = function(a, c) {
      var d = {};
      c || (c = b.identity);
      return function() {
        var b = c.apply(this, arguments);
        return m.call(d, b) ? d[b] : d[b] = a.apply(this, arguments)
      }
    };
    b.delay = function(a, b) {
      var d = i.call(arguments, 2);
      return setTimeout(function() {
        return a.apply(a, d)
      }, b)
    };
    b.defer = function(a) {
      return b.delay.apply(b, [a, 1].concat(i.call(arguments, 1)))
    };
    b.throttle = function(a, c) {
      var d, e, f, g, h, i = b.debounce(function() {
        h = g = false
      }, c);
      return function() {
        d = this;
        e = arguments;
        var b;
        f || (f = setTimeout(function() {
          f = null;
          h && a.apply(d, e);
          i()
        }, c));
        g ? h = true : a.apply(d, e);
        i();
        g = true
      }
    };
    b.debounce = function(a, b) {
      var d;
      return function() {
        var e = this,
            f = arguments;
        clearTimeout(d);
        d = setTimeout(function() {
          d = null;
          a.apply(e, f)
        }, b)
      }
    };
    b.once = function(a) {
      var b = false,
          d;
      return function() {
        if (b) return d;
        b = true;
        return d = a.apply(this, arguments)
      }
    };
    b.wrap = function(a, b) {
      return function() {
        var d = G.apply([a], arguments);
        return b.apply(this, d)
      }
    };
    b.compose = function() {
      var a = arguments;
      return function() {
        for (var b = arguments, d = a.length - 1; d >= 0; d--) b = [a[d].apply(this, b)];
        return b[0]
      }
    };
    b.after = function(a, b) {
      return a <= 0 ? b() : function() {
        if (--a < 1) return b.apply(this, arguments)
      }
    };
    b.keys = I ||
    function(a) {
      if (a !== Object(a)) throw new TypeError("Invalid object");
      var b = [],
          d;
      for (d in a) m.call(a, d) && (b[b.length] = d);
      return b
    };
    b.values = function(a) {
      return b.map(a, b.identity)
    };
    b.functions = b.methods = function(a) {
      var c = [],
          d;
      for (d in a) b.isFunction(a[d]) && c.push(d);
      return c.sort()
    };
    b.extend = function(a) {
      j(i.call(arguments, 1), function(b) {
        for (var d in b) b[d] !== void 0 && (a[d] = b[d])
      });
      return a
    };
    b.defaults = function(a) {
      j(i.call(arguments, 1), function(b) {
        for (var d in b) a[d] == null && (a[d] = b[d])
      });
      return a
    };
    b.clone = function(a) {
      return !b.isObject(a) ? a : b.isArray(a) ? a.slice() : b.extend({}, a)
    };
    b.tap = function(a, b) {
      b(a);
      return a
    };
    b.isEqual = function(a, b) {
      return r(a, b, [])
    };
    b.isEmpty = function(a) {
      if (b.isArray(a) || b.isString(a)) return a.length === 0;
      for (var c in a) if (m.call(a, c)) return false;
      return true
    };
    b.isElement = function(a) {
      return !!(a && a.nodeType == 1)
    };
    b.isArray = p ||
    function(a) {
      return l.call(a) == "[object Array]"
    };
    b.isObject = function(a) {
      return a === Object(a)
    };
    b.isArguments = function(a) {
      return l.call(a) == "[object Arguments]"
    };
    if (!b.isArguments(arguments)) b.isArguments = function(a) {
      return !(!a || !m.call(a, "callee"))
    };
    b.isFunction = function(a) {
      return l.call(a) == "[object Function]"
    };
    b.isString = function(a) {
      return l.call(a) == "[object String]"
    };
    b.isNumber = function(a) {
      return l.call(a) == "[object Number]"
    };
    b.isNaN = function(a) {
      return a !== a
    };
    b.isBoolean = function(a) {
      return a === true || a === false || l.call(a) == "[object Boolean]"
    };
    b.isDate = function(a) {
      return l.call(a) == "[object Date]"
    };
    b.isRegExp = function(a) {
      return l.call(a) == "[object RegExp]"
    };
    b.isNull = function(a) {
      return a === null
    };
    b.isUndefined = function(a) {
      return a === void 0
    };
    b.noConflict = function() {
      s._ = F;
      return this
    };
    b.identity = function(a) {
      return a
    };
    b.times = function(a, b, d) {
      for (var e = 0; e < a; e++) b.call(d, e)
    };
    b.escape = function(a) {
      return ("" + a).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#x27;").replace(/\//g, "&#x2F;")
    };
    b.mixin = function(a) {
      j(b.functions(a), function(c) {
        J(c, b[c] = a[c])
      })
    };
    var K = 0;
    b.uniqueId = function(a) {
      var b = K++;
      return a ? a + b : b
    };
    b.templateSettings = {
      evaluate: /<%([\s\S]+?)%>/g,
      interpolate: /<%=([\s\S]+?)%>/g,
      escape: /<%-([\s\S]+?)%>/g
    };
    b.template = function(a, c) {
      var d = b.templateSettings,
          d = "var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('" + a.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(d.escape, function(a, b) {
          return "',_.escape(" + b.replace(/\\'/g, "'") + "),'"
        }).replace(d.interpolate, function(a, b) {
          return "'," + b.replace(/\\'/g, "'") + ",'"
        }).replace(d.evaluate || null, function(a, b) {
          return "');" + b.replace(/\\'/g, "'").replace(/[\r\n\t]/g, " ") + ";__p.push('"
        }).replace(/\r/g, "\\r").replace(/\n/g, "\\n").replace(/\t/g, "\\t") + "');}return __p.join('');",
          e = new Function("obj", "_", d);
      return c ? e(c, b) : function(a) {
        return e.call(this, a, b)
      }
    };
    var n = function(a) {
        this._wrapped = a
        };
    b.prototype = n.prototype;
    var u = function(a, c) {
        return c ? b(a).chain() : a
        },
        J = function(a, c) {
        n.prototype[a] = function() {
          var a = i.call(arguments);
          H.call(a, this._wrapped);
          return u(c.apply(b, a), this._chain)
        }
        };
    b.mixin(b);
    j("pop,push,reverse,shift,sort,splice,unshift".split(","), function(a) {
      var b = k[a];
      n.prototype[a] = function() {
        b.apply(this._wrapped, arguments);
        return u(this._wrapped, this._chain)
      }
    });
    j(["concat", "join", "slice"], function(a) {
      var b = k[a];
      n.prototype[a] = function() {
        return u(b.apply(this._wrapped, arguments), this._chain)
      }
    });
    n.prototype.chain = function() {
      this._chain = true;
      return this
    };
    n.prototype.value = function() {
      return this._wrapped
    }
  }).call(this);
</script>

Setup

var chunk = 4;
    var arr = ["a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a80", "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89", "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98", "a99", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107", "a108", "a109", "a110", "a111", "a112", "a113", "a114", "a115", "a116", "a117", "a118", "a119", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179", "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188", "a189", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197", "a198", "a199", "a200", "a201", "a202", "a203", "a204", "a205", "a206", "a207", "a208", "a209", "a210", "a211", "a212", "a213", "a214", "a215", "a216", "a217", "a218", "a219", "a220", "a221", "a222", "a223", "a224", "a225", "a226", "a227", "a228", "a229", "a230", "a231", "a232", "a233", "a234", "a235", "a236", "a237", "a238", "a239", "a240", "a241", "a242", "a243", "a244", "a245", "a246", "a247", "a248", "a249", "a250", "a251", "a252", "a253", "a254", "a255", "a256", "a257", "a258", "a259", "a260", "a261", "a262", "a263", "a264", "a265", "a266", "a267", "a268", "a269", "a270", "a271", "a272", "a273", "a274", "a275", "a276", "a277", "a278", "a279", "a280", "a281", "a282", "a283", "a284", "a285", "a286", "a287", "a288", "a289", "a290", "a291", "a292", "a293", "a294", "a295", "a296", "a297", "a298", "a299", "a300", "a301", "a302", "a303", "a304", "a305", "a306", "a307", "a308", "a309", "a310", "a311", "a312", "a313", "a314", "a315", "a316", "a317", "a318", "a319", "a320", "a321", "a322", "a323", "a324", "a325", "a326", "a327", "a328", "a329", "a330", "a331", "a332", "a333", "a334", "a335", "a336", "a337", "a338", "a339", "a340", "a341", "a342", "a343", "a344", "a345", "a346", "a347", "a348", "a349", "a350", "a351", "a352", "a353", "a354", "a355", "a356", "a357", "a358", "a359", "a360", "a361", "a362", "a363", "a364", "a365", "a366", "a367", "a368", "a369", "a370", "a371", "a372", "a373", "a374", "a375", "a376", "a377", "a378", "a379", "a380", "a381", "a382", "a383", "a384", "a385", "a386", "a387", "a388", "a389", "a390", "a391", "a392", "a393", "a394", "a395", "a396", "a397", "a398", "a399", "a400", "a401", "a402", "a403", "a404", "a405", "a406", "a407", "a408", "a409", "a410", "a411", "a412", "a413", "a414", "a415", "a416", "a417", "a418", "a419", "a420", "a421", "a422", "a423", "a424", "a425", "a426", "a427", "a428", "a429", "a430", "a431", "a432", "a433", "a434", "a435", "a436", "a437", "a438", "a439", "a440", "a441", "a442", "a443", "a444", "a445", "a446", "a447", "a448", "a449", "a450", "a451", "a452", "a453", "a454", "a455", "a456", "a457", "a458", "a459", "a460", "a461", "a462", "a463", "a464", "a465", "a466", "a467", "a468", "a469", "a470", "a471", "a472", "a473", "a474", "a475", "a476", "a477", "a478", "a479", "a480", "a481", "a482", "a483", "a484", "a485", "a486", "a487", "a488", "a489", "a490", "a491", "a492", "a493", "a494", "a495", "a496", "a497", "a498", "a499", "a500", "a501", "a502", "a503", "a504", "a505", "a506", "a507", "a508", "a509", "a510", "a511", "a512", "a513", "a514", "a515", "a516", "a517", "a518", "a519", "a520", "a521", "a522", "a523", "a524", "a525", "a526", "a527", "a528", "a529", "a530", "a531", "a532", "a533", "a534", "a535", "a536", "a537", "a538", "a539", "a540", "a541", "a542", "a543", "a544", "a545", "a546", "a547", "a548", "a549", "a550", "a551", "a552", "a553", "a554", "a555", "a556", "a557", "a558", "a559", "a560", "a561", "a562", "a563", "a564", "a565", "a566", "a567", "a568", "a569", "a570", "a571", "a572", "a573", "a574", "a575", "a576", "a577", "a578", "a579", "a580", "a581", "a582", "a583", "a584", "a585", "a586", "a587", "a588", "a589", "a590", "a591", "a592", "a593", "a594", "a595", "a596", "a597", "a598", "a599", "a600", "a601", "a602", "a603", "a604", "a605", "a606", "a607", "a608", "a609", "a610", "a611", "a612", "a613", "a614", "a615", "a616", "a617", "a618", "a619", "a620", "a621", "a622", "a623", "a624", "a625", "a626", "a627", "a628", "a629", "a630", "a631", "a632", "a633", "a634", "a635", "a636", "a637", "a638", "a639", "a640", "a641", "a642", "a643", "a644", "a645", "a646", "a647", "a648", "a649", "a650", "a651", "a652", "a653", "a654", "a655", "a656", "a657", "a658", "a659", "a660", "a661", "a662", "a663", "a664", "a665", "a666", "a667", "a668", "a669", "a670", "a671", "a672", "a673", "a674", "a675", "a676", "a677", "a678", "a679", "a680", "a681", "a682", "a683", "a684", "a685", "a686", "a687", "a688", "a689", "a690", "a691", "a692", "a693", "a694", "a695", "a696", "a697", "a698", "a699", "a700", "a701", "a702", "a703", "a704", "a705", "a706", "a707", "a708", "a709", "a710", "a711", "a712", "a713", "a714", "a715", "a716", "a717", "a718", "a719", "a720", "a721", "a722", "a723", "a724", "a725", "a726", "a727", "a728", "a729", "a730", "a731", "a732", "a733", "a734", "a735", "a736", "a737", "a738", "a739", "a740", "a741", "a742", "a743", "a744", "a745", "a746", "a747", "a748", "a749", "a750", "a751", "a752", "a753", "a754", "a755", "a756", "a757", "a758", "a759", "a760", "a761", "a762", "a763", "a764", "a765", "a766", "a767", "a768", "a769", "a770", "a771", "a772", "a773", "a774", "a775", "a776", "a777", "a778", "a779", "a780", "a781", "a782", "a783", "a784", "a785", "a786", "a787", "a788", "a789", "a790", "a791", "a792", "a793", "a794", "a795", "a796", "a797", "a798", "a799", "a800", "a801", "a802", "a803", "a804", "a805", "a806", "a807", "a808", "a809", "a810", "a811", "a812", "a813", "a814", "a815", "a816", "a817", "a818", "a819", "a820", "a821", "a822", "a823", "a824", "a825", "a826", "a827", "a828", "a829", "a830", "a831", "a832", "a833", "a834", "a835", "a836", "a837", "a838", "a839", "a840", "a841", "a842", "a843", "a844", "a845", "a846", "a847", "a848", "a849", "a850", "a851", "a852", "a853", "a854", "a855", "a856", "a857", "a858", "a859", "a860", "a861", "a862", "a863", "a864", "a865", "a866", "a867", "a868", "a869", "a870", "a871", "a872", "a873", "a874", "a875", "a876", "a877", "a878", "a879", "a880", "a881", "a882", "a883", "a884", "a885", "a886", "a887", "a888", "a889", "a890", "a891", "a892", "a893", "a894", "a895", "a896", "a897", "a898", "a899", "a900", "a901", "a902", "a903", "a904", "a905", "a906", "a907", "a908", "a909", "a910", "a911", "a912", "a913", "a914", "a915", "a916", "a917", "a918", "a919", "a920", "a921", "a922", "a923", "a924", "a925", "a926", "a927", "a928", "a929", "a930", "a931", "a932", "a933", "a934", "a935", "a936", "a937", "a938", "a939", "a940", "a941", "a942", "a943", "a944", "a945", "a946", "a947", "a948", "a949", "a950", "a951", "a952", "a953", "a954", "a955", "a956", "a957", "a958", "a959", "a960", "a961", "a962", "a963", "a964", "a965", "a966", "a967", "a968", "a969", "a970", "a971", "a972", "a973", "a974", "a975", "a976", "a977", "a978", "a979", "a980", "a981", "a982", "a983", "a984", "a985", "a986", "a987", "a988", "a989", "a990", "a991", "a992", "a993", "a994", "a995", "a996", "a997", "a998", "a999"];

Test runner

Ready to run.

Testing in
TestOps/sec
Array splice
var i, j, temparray = [];
for (i = 0, j = arr.length; i < j; i += chunk) {
  temparray.push(arr.slice(i, i + chunk));
}
ready
Underscore
_(arr).groupBy(function(a, b) {
  return Math.floor(b / chunk);
});
ready
Sugar.js
arr.inGroupsOf(chunk)
ready
Underscore (bitwise ~~)
_(arr).groupBy(function(a, b) {
  return ~~(b / chunk);
});
ready

Revisions

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