From 8837212d58c354a7477e05d9450fd826c0c11fe0 Mon Sep 17 00:00:00 2001 From: Suguru Motegi Date: Wed, 20 May 2015 11:28:13 +0900 Subject: perf(slice): fix not to use `Array#slice` --- lib/async.js | 59 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/lib/async.js b/lib/async.js index d6cd961..47ab5a7 100644 --- a/lib/async.js +++ b/lib/async.js @@ -97,6 +97,23 @@ return keys; }; + var _baseSlice = function (arr, start) { + start = start || 0; + var index = -1; + var length = arr.length; + + if (start) { + length -= start; + length = length < 0 ? 0 : length; + } + var result = Array(length); + + while (++index < length) { + result[index] = arr[index + start]; + } + return result; + }; + //// exported async module functions //// //// nextTick implementation with browser-compatible fallback //// @@ -338,19 +355,19 @@ var doParallel = function (fn) { return function () { - var args = Array.prototype.slice.call(arguments); + var args = _baseSlice(arguments); return fn.apply(null, [async.each].concat(args)); }; }; var doParallelLimit = function(limit, fn) { return function () { - var args = Array.prototype.slice.call(arguments); + var args = _baseSlice(arguments); return fn.apply(null, [_eachLimit(limit)].concat(args)); }; }; var doSeries = function (fn) { return function () { - var args = Array.prototype.slice.call(arguments); + var args = _baseSlice(arguments); return fn.apply(null, [async.eachSeries].concat(args)); }; }; @@ -581,7 +598,7 @@ _each(keys, function (k) { var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]]; var taskCallback = function (err) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); if (args.length <= 1) { args = args[0]; } @@ -679,7 +696,7 @@ callback = noop; } else { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); var next = iterator.next(); if (next) { args.push(wrapIterator(next)); @@ -702,7 +719,7 @@ eachfn.map(tasks, function (fn, callback) { if (fn) { fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); if (args.length <= 1) { args = args[0]; } @@ -715,7 +732,7 @@ var results = {}; eachfn.each(_keys(tasks), function (k, callback) { tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); if (args.length <= 1) { args = args[0]; } @@ -742,7 +759,7 @@ async.mapSeries(tasks, function (fn, callback) { if (fn) { fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); if (args.length <= 1) { args = args[0]; } @@ -755,7 +772,7 @@ var results = {}; async.eachSeries(_keys(tasks), function (k, callback) { tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); if (args.length <= 1) { args = args[0]; } @@ -785,10 +802,10 @@ }; async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); return function () { return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) + null, args.concat(_baseSlice(arguments)) ); }; }; @@ -826,7 +843,7 @@ if (err) { return callback(err); } - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); if (test.apply(null, args)) { async.doWhilst(iterator, test, callback); } @@ -855,7 +872,7 @@ if (err) { return callback(err); } - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); if (!test.apply(null, args)) { async.doUntil(iterator, test, callback); } @@ -1104,9 +1121,9 @@ var _console_fn = function (name) { return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); + var args = _baseSlice(arguments, 1); if (typeof console !== 'undefined') { if (err) { if (console.error) { @@ -1135,7 +1152,7 @@ return x; }; var memoized = function () { - var args = Array.prototype.slice.call(arguments); + var args = _baseSlice(arguments); var callback = args.pop(); var key = hasher.apply(null, args); if (key in memo) { @@ -1149,7 +1166,7 @@ else { queues[key] = [callback]; fn.apply(null, args.concat([function () { - memo[key] = arguments; + memo[key] = _baseSlice(arguments); var q = queues[key]; delete queues[key]; for (var i = 0, l = q.length; i < l; i++) { @@ -1189,12 +1206,12 @@ var fns = arguments; return function () { var that = this; - var args = Array.prototype.slice.call(arguments); + var args = _baseSlice(arguments); var callback = args.pop(); async.reduce(fns, args, function (newargs, fn, cb) { fn.apply(that, newargs.concat([function () { var err = arguments[0]; - var nextargs = Array.prototype.slice.call(arguments, 1); + var nextargs = _baseSlice(arguments, 1); cb(err, nextargs); }])); }, @@ -1211,7 +1228,7 @@ var _applyEach = function (eachfn, fns /*args...*/) { var go = function () { var that = this; - var args = Array.prototype.slice.call(arguments); + var args = _baseSlice(arguments); var callback = args.pop(); return eachfn(fns, function (fn, cb) { fn.apply(that, args.concat([cb])); @@ -1219,7 +1236,7 @@ callback); }; if (arguments.length > 2) { - var args = Array.prototype.slice.call(arguments, 2); + var args = _baseSlice(arguments, 2); return go.apply(this, args); } else { -- cgit v1.2.1