From 66d6bbe7f174bc3adebf71d23d43d6bf05a64fb3 Mon Sep 17 00:00:00 2001 From: Graeme Yeates Date: Sat, 23 Jul 2016 11:13:22 -0400 Subject: [PATCH 1/2] Unroll simple loop abstractions --- lib/internal/queue.js | 27 +++++++++++++-------------- lib/priorityQueue.js | 7 +++---- lib/race.js | 7 +++---- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/lib/internal/queue.js b/lib/internal/queue.js index 41d6c904f..d318ba03c 100644 --- a/lib/internal/queue.js +++ b/lib/internal/queue.js @@ -1,4 +1,4 @@ -import arrayEach from 'lodash/_arrayEach'; +import indexOf from 'lodash/_baseIndexOf'; import isArray from 'lodash/isArray'; import noop from 'lodash/noop'; import rest from 'lodash/rest'; @@ -23,15 +23,16 @@ export default function queue(worker, concurrency, payload) { if (!isArray(data)) { data = [data]; } - if(data.length === 0 && q.idle()) { + if (data.length === 0 && q.idle()) { // call drain immediately if there are no tasks return setImmediate(function() { q.drain(); }); } - arrayEach(data, function(task) { + + for (var i = 0, l = data.length; i < l; i++) { var item = { - data: task, + data: data[i], callback: callback || noop }; @@ -40,8 +41,7 @@ export default function queue(worker, concurrency, payload) { } else { q._tasks.push(item); } - - }); + } setImmediate(q.process); } @@ -49,20 +49,19 @@ export default function queue(worker, concurrency, payload) { return rest(function(args){ workers -= 1; - arrayEach(tasks, function (task) { - arrayEach(workersList, function (worker, index) { - if (worker === task) { - workersList.splice(index, 1); - return false; - } - }); + for (var i = 0, l = tasks.length; i < l; i++) { + var task = tasks[i]; + var index = indexOf(workersList, task, 0); + if (index >= 0) { + workersList.splice(index) + } task.callback.apply(task, args); if (args[0] != null) { q.error(args[0], task.data); } - }); + } if (workers <= (q.concurrency - q.buffer) ) { q.unsaturated(); diff --git a/lib/priorityQueue.js b/lib/priorityQueue.js index d8b601638..0af01577c 100644 --- a/lib/priorityQueue.js +++ b/lib/priorityQueue.js @@ -1,4 +1,3 @@ -import arrayEach from 'lodash/_arrayEach'; import isArray from 'lodash/isArray'; import noop from 'lodash/noop'; @@ -57,9 +56,9 @@ export default function(worker, concurrency) { nextNode = nextNode.next; } - arrayEach(data, function(task) { + for (var i = 0, l = data.length; i < l; i++) { var item = { - data: task, + data: data[i], priority: priority, callback: callback }; @@ -69,7 +68,7 @@ export default function(worker, concurrency) { } else { q._tasks.push(item); } - }); + } setImmediate(q.process); }; diff --git a/lib/race.js b/lib/race.js index 55d37ee7d..693762787 100644 --- a/lib/race.js +++ b/lib/race.js @@ -1,5 +1,4 @@ import isArray from 'lodash/isArray'; -import arrayEach from 'lodash/_arrayEach'; import noop from 'lodash/noop'; import once from './internal/once'; @@ -44,7 +43,7 @@ export default function race(tasks, callback) { callback = once(callback || noop); if (!isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions')); if (!tasks.length) return callback(); - arrayEach(tasks, function (task) { - task(callback); - }); + for (var i = 0, l = tasks.length; i < l; i++) { + tasks[i](callback); + } } From 5b8931d40205778a5bf4e936efb10046b79eb018 Mon Sep 17 00:00:00 2001 From: Graeme Yeates Date: Sat, 23 Jul 2016 11:13:31 -0400 Subject: [PATCH 2/2] Add filter benchmark --- perf/suites.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/perf/suites.js b/perf/suites.js index 244b32b67..dfef9f610 100644 --- a/perf/suites.js +++ b/perf/suites.js @@ -1,5 +1,6 @@ var _ = require("lodash"); var tasks; +var count; module.exports = [{ name: "each", @@ -93,6 +94,42 @@ module.exports = [{ async.setImmediate(cb); }, done); } +}, { + name: "filter", + args: [ + [10], + [300], + [10000] + ], + setup: function(c) { + count = c; + tasks = _.range(count); + }, + fn: function(async, done) { + async.filter(tasks, function(num, cb) { + async.setImmediate(function() { + cb(null, num > (count / 2)); + }); + }, done); + } +}, { + name: "filterLimit", + args: [ + [10], + [300], + [10000] + ], + setup: function(c) { + count = c; + tasks = _.range(count); + }, + fn: function(async, done) { + async.filterLimit(tasks, 10, function(num, cb) { + async.setImmediate(function() { + cb(null, num > (count / 2)); + }); + }, done); + } }, { name: "eachOf", // args lists are passed to the setup function