Skip to content

Commit

Permalink
add benchmark about array concat
Browse files Browse the repository at this point in the history
  • Loading branch information
elidoran authored and ljharb committed Dec 22, 2016
1 parent ae3d972 commit 9c69e3d
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 0 deletions.
1 change: 1 addition & 0 deletions .npmignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ bower.json
component.json
.npmignore
.travis.yml
benchmark/
5 changes: 5 additions & 0 deletions benchmark/.eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"rules": {
"no-console": 0,
},
}
142 changes: 142 additions & 0 deletions benchmark/arraying.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
'use strict';

require('console.table');

var comma = require('comma-number');
var Benchmark = require('benchmark');

Benchmark.options.initCount = 100;
Benchmark.options.minSamples = 100;

// useful when altering tests, causes thing to run quickly
// Benchmark.options.initCount = 1
// Benchmark.options.minSamples = 1
// Benchmark.options.minTime = -1
// Benchmark.options.maxTime = -1

var singles = function singles(fn) {
return function () {
return fn('1', '2');
};
};

var arrayThenSingle = function arrayThenSingle(fn) {
return function () {
return fn([
'1', '11', '111'
], '2');
};
};

var singleThenArray = function singleThenArray(fn) {
return function () {
return fn('1', [
'2', '22', '222'
]);
};
};

var arrays = function arrays(fn) {
return function () {
return fn([
'1', '11', '111'
], [
'2', '22', '222'
]);
};
};

var methods = [
function original(a, b) {
return [].concat(a, b);
},

function consolidated(a, b) {
return [].concat(a, b);
},

function awkward(a, b) {
return Array.prototype.concat(a, b);
},

// this isn't able to handle the second arg being an array.
function halfway(a, b) {
if (Array.isArray(a)) {
a.push(b);
return a;
} else {
return [a, b];
}
},

function mutating(a, b) {
// we always use both of these, so, let's calculate them now
var firstIsArray = Array.isArray(a);
var secondIsArray = Array.isArray(b);

// mutate `a` to append `b` and then return it
if (firstIsArray) {
if (secondIsArray) {
a.push.apply(a, b);
} else {
a.push(b);
}
return a;
}

// mutate `b` to prepend `a` and then return it
if (secondIsArray) {
b.unshift(a);
return b;
}

// neither are arrays, so, create a new array with both
return [a, b];
}
];

methods[0].style = '[].concat(a).concat(b)';
methods[1].style = '[].concat(a, b)';
methods[2].style = 'Array.prototype.concat(a, b)';
methods[3].style = 'Array.isArray halfway';
methods[4].style = 'Array.isArray both';

var suite = new Benchmark.Suite();
var results = [];

methods.forEach(function (method, index) {
results.push([method.style]);

suite.add(method.style + ' with 2 non-arrays', singles(method));
suite.add(method.style + ' with an array then a non-array', arrayThenSingle(method));

if (index !== 3) {
suite.add(method.style + ' with a non-array then an array', singleThenArray(method));
suite.add(method.style + ' with 2 arrays', arrays(method));
}
});

var row = 0;

suite.on('cycle', function (event) {
var its = event.target;

console.log('completed', its.name);

results[row].push(comma(its.hz.toFixed(0)) + ' (+-' + its.stats.rme.toFixed(2) + '%)');

if (results[row].length === 5 || (row === 3 && results[row].length === 3)) {
row += 1;
}
});

suite.on('complete', function () {
console.log();
console.table([
'Name', '" / "', '[] / "', '" / []', '[] / []'
], results);
});

suite.run({
async: false
});
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@
"dependencies": {},
"devDependencies": {
"@ljharb/eslint-config": "^13.0.0",
"benchmark": "^2.1.4",
"browserify": "^16.2.2",
"comma-number": "^2.0.0",
"console.table": "^0.10.0",
"covert": "^1.1.0",
"editorconfig-tools": "^0.1.1",
"eslint": "^5.6.0",
Expand Down

0 comments on commit 9c69e3d

Please sign in to comment.