From c647e87504ad1855cad243bd4b3f9b78764a1144 Mon Sep 17 00:00:00 2001 From: Anton Khlynovskiy Date: Tue, 26 Jan 2016 15:13:12 +0300 Subject: [PATCH] lib: freelist: use .pop() for allocation Array#pop() is known to be faster than Array#shift(). To be exact, it's O(1) vs. O(n). In this case there's no difference from which side of the "pool" array the object is retrieved, so .pop() should be preferred. PR-URL: https://github.com/nodejs/node/pull/2174 Reviewed-By: mscdex - Brian White Reviewed-By: jasnell - James M Snell Reviewed-By: ofrobots - Ali Ijaz Sheikh --- benchmark/misc/freelist.js | 38 ++++++++++++++++++++++++++++++++++ lib/internal/freelist.js | 2 +- test/parallel/test-freelist.js | 4 ++-- 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 benchmark/misc/freelist.js diff --git a/benchmark/misc/freelist.js b/benchmark/misc/freelist.js new file mode 100644 index 0000000000..76275000b0 --- /dev/null +++ b/benchmark/misc/freelist.js @@ -0,0 +1,38 @@ +'use strict'; + +var common = require('../common.js'); +var FreeList = require('internal/freelist').FreeList; + +var bench = common.createBenchmark(main, { + n: [100000] +}); + +function main(conf) { + var n = conf.n; + var poolSize = 1000; + var list = new FreeList('test', poolSize, Object); + var i; + var j; + var used = []; + + // First, alloc `poolSize` items + for (j = 0; j < poolSize; j++) { + used.push(list.alloc()); + } + + bench.start(); + + for (i = 0; i < n; i++){ + // Return all the items to the pool + for (j = 0; j < poolSize; j++) { + list.free(used[j]); + } + + // Re-alloc from pool + for (j = 0; j < poolSize; j++) { + list.alloc(); + } + } + + bench.end(n); +} diff --git a/lib/internal/freelist.js b/lib/internal/freelist.js index 4b17d154d4..580726e872 100644 --- a/lib/internal/freelist.js +++ b/lib/internal/freelist.js @@ -10,7 +10,7 @@ exports.FreeList = function(name, max, constructor) { exports.FreeList.prototype.alloc = function() { - return this.list.length ? this.list.shift() : + return this.list.length ? this.list.pop() : this.constructor.apply(this, arguments); }; diff --git a/test/parallel/test-freelist.js b/test/parallel/test-freelist.js index 270ff4ec00..feb5dcc9a9 100644 --- a/test/parallel/test-freelist.js +++ b/test/parallel/test-freelist.js @@ -27,6 +27,6 @@ assert.strictEqual(flist1.free('test4'), false); assert.strictEqual(flist1.free('test5'), false); // At this point 'alloc' should just return the stored values -assert.strictEqual(flist1.alloc(), 'test1'); -assert.strictEqual(flist1.alloc(), 'test2'); assert.strictEqual(flist1.alloc(), 'test3'); +assert.strictEqual(flist1.alloc(), 'test2'); +assert.strictEqual(flist1.alloc(), 'test1');