Skip to content

Instantly share code, notes, and snippets.

@maxnordlund
Last active September 27, 2018 12:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maxnordlund/63ae220d410c0e1e686b2860cb2b992f to your computer and use it in GitHub Desktop.
Save maxnordlund/63ae220d410c0e1e686b2860cb2b992f to your computer and use it in GitHub Desktop.
Quick micro benchmark regarding passing of arguments
module.exports = exports = benchmark
function benchmark(size, fn, name) {
console.time("benchmark " + name)
var result = 0
for (var i = 0; i < size; ++i) result = fn(result, i)()
console.timeEnd("benchmark " + name)
console.log(result)
}
function add(a, b) { return a + b }
function sum(a, b) {
return function() {
return add(a, b)
}
}
function passingArguments(fn) {
return function capture() {
var that = this, args = arguments
return function apply() {
return fn.apply(that, args)
}
}
}
function bindBindApply(fn) {
return function capture() {
return fn.bind.bind(fn, this).apply(undefined, arguments)
}
}
function argsArray(fn) {
return function capture() {
var that = this, args = []
for (var i = 0, len = arguments.length; i < len; ++i) {
args.push(arguments[i])
}
return function apply() {
return fn.apply(that, args)
}
}
}
function pushArgsArray(fn) {
return function capture() {
var that = this, args = []
args.push.apply(args, arguments)
return function apply() {
return fn.apply(that, args)
}
}
}
function run() {
benchmark(1e6, sum, "sum")
benchmark(1e6, passingArguments(add), "passingArguments")
benchmark(1e6, bindBindApply(add), "bindBindApply")
benchmark(1e6, argsArray(add), "argsArray")
benchmark(1e6, pushArgsArray(add), "pushArgsArray")
}
run()
Edge:
benchmark sum: 1 279,4ms
benchmark passingArguments: 2 709,7ms
benchmark bindBindApply: 2 930ms
benchmark argsArray: 3 450,7ms
benchmark pushArgsArray: 3 264,2ms
IE11:
benchmark sum: 1 617,2ms
benchmark passingArguments: 2 325,9ms
benchmark bindBindApply: 1 537,2ms
benchmark argsArray: 1 688,2ms
benchmark pushArgsArray: 2 656ms
Win FF:
benchmark sum: 329ms
benchmark passingArguments: 1124ms
benchmark bindBindApply: 582ms
benchmark argsArray: 611ms
benchmark pushArgsArray: 1381ms
Win Chrome:
benchmark sum: 60ms
benchmark passingArguments: 96ms
benchmark bindBindApply: 143.000244140625ms
benchmark argsArray: 171.999755859375ms
benchmark pushArgsArray: 510ms
Mac FF:
benchmark sum: 233ms
benchmark passingArguments: 548ms
benchmark bindBindApply: 445ms
benchmark argsArray: 430ms
benchmark pushArgsArray: 706ms
Mac Chrome:
benchmark sum: 68.081787109375ms
benchmark passingArguments: 108.812744140625ms
benchmark bindBindApply: 133.889892578125ms
benchmark argsArray: 246.803955078125ms
benchmark pushArgsArray: 512.780029296875ms
Safari:
benchmark sum: 81.586ms
benchmark passingArguments: 143.363ms
benchmark bindBindApply: 612.219ms
benchmark argsArray: 165.935ms
benchmark pushArgsArray: 227.067ms
Node 10.10.0:
benchmark sum: 9.005ms
benchmark passingArguments: 68.174ms
benchmark bindBindApply: 90.786ms
benchmark argsArray: 155.998ms
benchmark pushArgsArray: 363.361ms
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment