Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Show benchmarking for array combine stuff #187

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .npmignore
Expand Up @@ -2,3 +2,4 @@ bower.json
component.json
.npmignore
.travis.yml
benchmark/
128 changes: 128 additions & 0 deletions benchmark/arraying.js
@@ -0,0 +1,128 @@
require('console.table')

var comma = require('comma-number')
, Benchmark = require('benchmark')
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

comma last, please :-)


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


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

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

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

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

var methods = [
function original(a, b) {
return [].concat(a).concat(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) {
secondIsArray ? a.push.apply(a, b) : 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
, 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
, column = 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++
}
})

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

suite.run({
async: false
})
3 changes: 3 additions & 0 deletions package.json
Expand Up @@ -25,7 +25,10 @@
"dependencies": {},
"devDependencies": {
"@ljharb/eslint-config": "^9.0.1",
"benchmark": "^2.1.2",
"browserify": "^13.1.1",
"comma-number": "^1.1.0",
"console.table": "^0.7.0",
"covert": "^1.1.0",
"eslint": "^3.12.2",
"evalmd": "^0.0.17",
Expand Down