1978 lines
55 KiB
JavaScript
1978 lines
55 KiB
JavaScript
;(function() {
|
|
'use strict';
|
|
|
|
/** Used to access the Firebug Lite panel (set by `run`). */
|
|
var fbPanel;
|
|
|
|
/** Used as a safe reference for `undefined` in pre ES5 environments. */
|
|
var undefined;
|
|
|
|
/** Used as a reference to the global object. */
|
|
var root = typeof global == 'object' && global || this;
|
|
|
|
/** Method and object shortcuts. */
|
|
var phantom = root.phantom,
|
|
amd = root.define && define.amd,
|
|
argv = root.process && process.argv,
|
|
document = !phantom && root.document,
|
|
noop = function() {},
|
|
params = root.arguments,
|
|
system = root.system;
|
|
|
|
/** Add `console.log()` support for Rhino and RingoJS. */
|
|
var console = root.console || (root.console = { 'log': root.print });
|
|
|
|
/** The file path of the lodash file to test. */
|
|
var filePath = (function() {
|
|
var min = 0,
|
|
result = [];
|
|
|
|
if (phantom) {
|
|
result = params = phantom.args;
|
|
} else if (system) {
|
|
min = 1;
|
|
result = params = system.args;
|
|
} else if (argv) {
|
|
min = 2;
|
|
result = params = argv;
|
|
} else if (params) {
|
|
result = params;
|
|
}
|
|
var last = result[result.length - 1];
|
|
result = (result.length > min && !/perf(?:\.js)?$/.test(last)) ? last : '../lodash.js';
|
|
|
|
if (!amd) {
|
|
try {
|
|
result = require('fs').realpathSync(result);
|
|
} catch (e) {}
|
|
|
|
try {
|
|
result = require.resolve(result);
|
|
} catch (e) {}
|
|
}
|
|
return result;
|
|
}());
|
|
|
|
/** Used to match path separators. */
|
|
var rePathSeparator = /[\/\\]/;
|
|
|
|
/** Used to detect primitive types. */
|
|
var rePrimitive = /^(?:boolean|number|string|undefined)$/;
|
|
|
|
/** Used to match RegExp special characters. */
|
|
var reSpecialChars = /[.*+?^=!:${}()|[\]\/\\]/g;
|
|
|
|
/** The `ui` object. */
|
|
var ui = root.ui || (root.ui = {
|
|
'buildPath': basename(filePath, '.js'),
|
|
'otherPath': 'underscore'
|
|
});
|
|
|
|
/** The lodash build basename. */
|
|
var buildName = root.buildName = basename(ui.buildPath, '.js');
|
|
|
|
/** The other library basename. */
|
|
var otherName = root.otherName = (function() {
|
|
var result = basename(ui.otherPath, '.js');
|
|
return result + (result == buildName ? ' (2)' : '');
|
|
}());
|
|
|
|
/** Used to score performance. */
|
|
var score = { 'a': [], 'b': [] };
|
|
|
|
/** Used to queue benchmark suites. */
|
|
var suites = [];
|
|
|
|
/** Use a single "load" function. */
|
|
var load = (typeof require == 'function' && !amd)
|
|
? require
|
|
: noop;
|
|
|
|
/** Load lodash. */
|
|
var lodash = root.lodash || (root.lodash = (
|
|
lodash = load(filePath) || root._,
|
|
lodash = lodash._ || lodash,
|
|
(lodash.runInContext ? lodash.runInContext(root) : lodash),
|
|
lodash.noConflict()
|
|
));
|
|
|
|
/** Load Underscore. */
|
|
var _ = root.underscore || (root.underscore = (
|
|
_ = load('../vendor/underscore/underscore.js') || root._,
|
|
_._ || _
|
|
));
|
|
|
|
/** Load Benchmark.js. */
|
|
var Benchmark = root.Benchmark || (root.Benchmark = (
|
|
Benchmark = load('../node_modules/benchmark/benchmark.js') || root.Benchmark,
|
|
Benchmark = Benchmark.Benchmark || Benchmark,
|
|
Benchmark.runInContext(lodash.extend({}, root, { '_': lodash }))
|
|
));
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Gets the basename of the given `filePath`. If the file `extension` is passed,
|
|
* it will be removed from the basename.
|
|
*
|
|
* @private
|
|
* @param {string} path The file path to inspect.
|
|
* @param {string} extension The extension to remove.
|
|
* @returns {string} Returns the basename.
|
|
*/
|
|
function basename(filePath, extension) {
|
|
var result = (filePath || '').split(rePathSeparator).pop();
|
|
return (arguments.length < 2)
|
|
? result
|
|
: result.replace(RegExp(extension.replace(reSpecialChars, '\\$&') + '$'), '');
|
|
}
|
|
|
|
/**
|
|
* Computes the geometric mean (log-average) of an array of values.
|
|
* See http://en.wikipedia.org/wiki/Geometric_mean#Relationship_with_arithmetic_mean_of_logarithms.
|
|
*
|
|
* @private
|
|
* @param {Array} array The array of values.
|
|
* @returns {number} The geometric mean.
|
|
*/
|
|
function getGeometricMean(array) {
|
|
return Math.pow(Math.E, lodash.reduce(array, function(sum, x) {
|
|
return sum + Math.log(x);
|
|
}, 0) / array.length) || 0;
|
|
}
|
|
|
|
/**
|
|
* Gets the Hz, i.e. operations per second, of `bench` adjusted for the
|
|
* margin of error.
|
|
*
|
|
* @private
|
|
* @param {Object} bench The benchmark object.
|
|
* @returns {number} Returns the adjusted Hz.
|
|
*/
|
|
function getHz(bench) {
|
|
var result = 1 / (bench.stats.mean + bench.stats.moe);
|
|
return isFinite(result) ? result : 0;
|
|
}
|
|
|
|
/**
|
|
* Host objects can return type values that are different from their actual
|
|
* data type. The objects we are concerned with usually return non-primitive
|
|
* types of "object", "function", or "unknown".
|
|
*
|
|
* @private
|
|
* @param {*} object The owner of the property.
|
|
* @param {string} property The property to check.
|
|
* @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`.
|
|
*/
|
|
function isHostType(object, property) {
|
|
if (object == null) {
|
|
return false;
|
|
}
|
|
var type = typeof object[property];
|
|
return !rePrimitive.test(type) && (type != 'object' || !!object[property]);
|
|
}
|
|
|
|
/**
|
|
* Logs text to the console.
|
|
*
|
|
* @private
|
|
* @param {string} text The text to log.
|
|
*/
|
|
function log(text) {
|
|
console.log(text + '');
|
|
if (fbPanel) {
|
|
// Scroll the Firebug Lite panel down.
|
|
fbPanel.scrollTop = fbPanel.scrollHeight;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Runs all benchmark suites.
|
|
*
|
|
* @private (@public in the browser)
|
|
*/
|
|
function run() {
|
|
fbPanel = (fbPanel = root.document && document.getElementById('FirebugUI')) &&
|
|
(fbPanel = (fbPanel = fbPanel.contentWindow || fbPanel.contentDocument).document || fbPanel) &&
|
|
fbPanel.getElementById('fbPanel1');
|
|
|
|
log('\nSit back and relax, this may take a while.');
|
|
suites[0].run({ 'async': true });
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
lodash.extend(Benchmark.Suite.options, {
|
|
'onStart': function() {
|
|
log('\n' + this.name + ':');
|
|
},
|
|
'onCycle': function(event) {
|
|
log(event.target);
|
|
},
|
|
'onComplete': function() {
|
|
for (var index = 0, length = this.length; index < length; index++) {
|
|
var bench = this[index];
|
|
if (bench.error) {
|
|
var errored = true;
|
|
}
|
|
}
|
|
if (errored) {
|
|
log('There was a problem, skipping...');
|
|
}
|
|
else {
|
|
var formatNumber = Benchmark.formatNumber,
|
|
fastest = this.filter('fastest'),
|
|
fastestHz = getHz(fastest[0]),
|
|
slowest = this.filter('slowest'),
|
|
slowestHz = getHz(slowest[0]),
|
|
aHz = getHz(this[0]),
|
|
bHz = getHz(this[1]);
|
|
|
|
if (fastest.length > 1) {
|
|
log('It\'s too close to call.');
|
|
aHz = bHz = slowestHz;
|
|
}
|
|
else {
|
|
var percent = ((fastestHz / slowestHz) - 1) * 100;
|
|
|
|
log(
|
|
fastest[0].name + ' is ' +
|
|
formatNumber(percent < 1 ? percent.toFixed(2) : Math.round(percent)) +
|
|
'% faster.'
|
|
);
|
|
}
|
|
// Add score adjusted for margin of error.
|
|
score.a.push(aHz);
|
|
score.b.push(bHz);
|
|
}
|
|
// Remove current suite from queue.
|
|
suites.shift();
|
|
|
|
if (suites.length) {
|
|
// Run next suite.
|
|
suites[0].run({ 'async': true });
|
|
}
|
|
else {
|
|
var aMeanHz = getGeometricMean(score.a),
|
|
bMeanHz = getGeometricMean(score.b),
|
|
fastestMeanHz = Math.max(aMeanHz, bMeanHz),
|
|
slowestMeanHz = Math.min(aMeanHz, bMeanHz),
|
|
xFaster = fastestMeanHz / slowestMeanHz,
|
|
percentFaster = formatNumber(Math.round((xFaster - 1) * 100)),
|
|
message = 'is ' + percentFaster + '% ' + (xFaster == 1 ? '' : '(' + formatNumber(xFaster.toFixed(2)) + 'x) ') + 'faster than';
|
|
|
|
// Report results.
|
|
if (aMeanHz >= bMeanHz) {
|
|
log('\n' + buildName + ' ' + message + ' ' + otherName + '.');
|
|
} else {
|
|
log('\n' + otherName + ' ' + message + ' ' + buildName + '.');
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
lodash.extend(Benchmark.options, {
|
|
'async': true,
|
|
'setup': '\
|
|
var _ = global.underscore,\
|
|
lodash = global.lodash,\
|
|
belt = this.name == buildName ? lodash : _;\
|
|
\
|
|
var date = new Date,\
|
|
limit = 50,\
|
|
regexp = /x/,\
|
|
object = {},\
|
|
objects = Array(limit),\
|
|
numbers = Array(limit),\
|
|
fourNumbers = [5, 25, 10, 30],\
|
|
nestedNumbers = [1, [2], [3, [[4]]]],\
|
|
nestedObjects = [{}, [{}], [{}, [[{}]]]],\
|
|
twoNumbers = [12, 23];\
|
|
\
|
|
for (var index = 0; index < limit; index++) {\
|
|
numbers[index] = index;\
|
|
object["key" + index] = index;\
|
|
objects[index] = { "num": index };\
|
|
}\
|
|
var strNumbers = numbers + "";\
|
|
\
|
|
if (typeof assign != "undefined") {\
|
|
var _assign = _.assign || _.extend,\
|
|
lodashAssign = lodash.assign;\
|
|
}\
|
|
if (typeof bind != "undefined") {\
|
|
var thisArg = { "name": "fred" };\
|
|
\
|
|
var func = function(greeting, punctuation) {\
|
|
return (greeting || "hi") + " " + this.name + (punctuation || ".");\
|
|
};\
|
|
\
|
|
var _boundNormal = _.bind(func, thisArg),\
|
|
_boundMultiple = _boundNormal,\
|
|
_boundPartial = _.bind(func, thisArg, "hi");\
|
|
\
|
|
var lodashBoundNormal = lodash.bind(func, thisArg),\
|
|
lodashBoundMultiple = lodashBoundNormal,\
|
|
lodashBoundPartial = lodash.bind(func, thisArg, "hi");\
|
|
\
|
|
for (index = 0; index < 10; index++) {\
|
|
_boundMultiple = _.bind(_boundMultiple, { "name": "fred" + index });\
|
|
lodashBoundMultiple = lodash.bind(lodashBoundMultiple, { "name": "fred" + index });\
|
|
}\
|
|
}\
|
|
if (typeof bindAll != "undefined") {\
|
|
var bindAllCount = -1,\
|
|
bindAllObjects = Array(this.count);\
|
|
\
|
|
var funcNames = belt.reject(belt.functions(belt).slice(0, 40), function(funcName) {\
|
|
return /^_/.test(funcName);\
|
|
});\
|
|
\
|
|
// Potentially expensive.\n\
|
|
for (index = 0; index < this.count; index++) {\
|
|
bindAllObjects[index] = belt.reduce(funcNames, function(object, funcName) {\
|
|
object[funcName] = belt[funcName];\
|
|
return object;\
|
|
}, {});\
|
|
}\
|
|
}\
|
|
if (typeof chaining != "undefined") {\
|
|
var even = function(v) { return v % 2 == 0; },\
|
|
square = function(v) { return v * v; };\
|
|
\
|
|
var largeArray = belt.range(10000),\
|
|
_chaining = _(largeArray).chain(),\
|
|
lodashChaining = lodash(largeArray).chain();\
|
|
}\
|
|
if (typeof compact != "undefined") {\
|
|
var uncompacted = numbers.slice();\
|
|
uncompacted[2] = false;\
|
|
uncompacted[6] = null;\
|
|
uncompacted[18] = "";\
|
|
}\
|
|
if (typeof flowRight != "undefined") {\
|
|
var compAddOne = function(n) { return n + 1; },\
|
|
compAddTwo = function(n) { return n + 2; },\
|
|
compAddThree = function(n) { return n + 3; };\
|
|
\
|
|
var _composed = _.flowRight && _.flowRight(compAddThree, compAddTwo, compAddOne),\
|
|
lodashComposed = lodash.flowRight && lodash.flowRight(compAddThree, compAddTwo, compAddOne);\
|
|
}\
|
|
if (typeof countBy != "undefined" || typeof omit != "undefined") {\
|
|
var wordToNumber = {\
|
|
"one": 1,\
|
|
"two": 2,\
|
|
"three": 3,\
|
|
"four": 4,\
|
|
"five": 5,\
|
|
"six": 6,\
|
|
"seven": 7,\
|
|
"eight": 8,\
|
|
"nine": 9,\
|
|
"ten": 10,\
|
|
"eleven": 11,\
|
|
"twelve": 12,\
|
|
"thirteen": 13,\
|
|
"fourteen": 14,\
|
|
"fifteen": 15,\
|
|
"sixteen": 16,\
|
|
"seventeen": 17,\
|
|
"eighteen": 18,\
|
|
"nineteen": 19,\
|
|
"twenty": 20,\
|
|
"twenty-one": 21,\
|
|
"twenty-two": 22,\
|
|
"twenty-three": 23,\
|
|
"twenty-four": 24,\
|
|
"twenty-five": 25,\
|
|
"twenty-six": 26,\
|
|
"twenty-seven": 27,\
|
|
"twenty-eight": 28,\
|
|
"twenty-nine": 29,\
|
|
"thirty": 30,\
|
|
"thirty-one": 31,\
|
|
"thirty-two": 32,\
|
|
"thirty-three": 33,\
|
|
"thirty-four": 34,\
|
|
"thirty-five": 35,\
|
|
"thirty-six": 36,\
|
|
"thirty-seven": 37,\
|
|
"thirty-eight": 38,\
|
|
"thirty-nine": 39,\
|
|
"forty": 40\
|
|
};\
|
|
\
|
|
var words = belt.keys(wordToNumber).slice(0, limit);\
|
|
}\
|
|
if (typeof flatten != "undefined") {\
|
|
var _flattenDeep = _.flatten([[1]])[0] !== 1,\
|
|
lodashFlattenDeep = lodash.flatten([[1]])[0] !== 1;\
|
|
}\
|
|
if (typeof isEqual != "undefined") {\
|
|
var objectOfPrimitives = {\
|
|
"boolean": true,\
|
|
"number": 1,\
|
|
"string": "a"\
|
|
};\
|
|
\
|
|
var objectOfObjects = {\
|
|
"boolean": new Boolean(true),\
|
|
"number": new Number(1),\
|
|
"string": new String("a")\
|
|
};\
|
|
\
|
|
var objectOfObjects2 = {\
|
|
"boolean": new Boolean(true),\
|
|
"number": new Number(1),\
|
|
"string": new String("A")\
|
|
};\
|
|
\
|
|
var object2 = {},\
|
|
object3 = {},\
|
|
objects2 = Array(limit),\
|
|
objects3 = Array(limit),\
|
|
numbers2 = Array(limit),\
|
|
numbers3 = Array(limit),\
|
|
nestedNumbers2 = [1, [2], [3, [[4]]]],\
|
|
nestedNumbers3 = [1, [2], [3, [[6]]]];\
|
|
\
|
|
for (index = 0; index < limit; index++) {\
|
|
object2["key" + index] = index;\
|
|
object3["key" + index] = index;\
|
|
objects2[index] = { "num": index };\
|
|
objects3[index] = { "num": index };\
|
|
numbers2[index] = index;\
|
|
numbers3[index] = index;\
|
|
}\
|
|
object3["key" + (limit - 1)] = -1;\
|
|
objects3[limit - 1].num = -1;\
|
|
numbers3[limit - 1] = -1;\
|
|
}\
|
|
if (typeof matches != "undefined") {\
|
|
var source = { "num": 9 };\
|
|
\
|
|
var _matcher = (_.matches || _.noop)(source),\
|
|
lodashMatcher = (lodash.matches || lodash.noop)(source);\
|
|
}\
|
|
if (typeof multiArrays != "undefined") {\
|
|
var twentyValues = belt.shuffle(belt.range(20)),\
|
|
fortyValues = belt.shuffle(belt.range(40)),\
|
|
hundredSortedValues = belt.range(100),\
|
|
hundredValues = belt.shuffle(hundredSortedValues),\
|
|
hundredValues2 = belt.shuffle(hundredValues),\
|
|
hundredTwentyValues = belt.shuffle(belt.range(120)),\
|
|
hundredTwentyValues2 = belt.shuffle(hundredTwentyValues),\
|
|
twoHundredValues = belt.shuffle(belt.range(200)),\
|
|
twoHundredValues2 = belt.shuffle(twoHundredValues);\
|
|
}\
|
|
if (typeof partial != "undefined") {\
|
|
var func = function(greeting, punctuation) {\
|
|
return greeting + " fred" + (punctuation || ".");\
|
|
};\
|
|
\
|
|
var _partial = _.partial(func, "hi"),\
|
|
lodashPartial = lodash.partial(func, "hi");\
|
|
}\
|
|
if (typeof template != "undefined") {\
|
|
var tplData = {\
|
|
"header1": "Header1",\
|
|
"header2": "Header2",\
|
|
"header3": "Header3",\
|
|
"header4": "Header4",\
|
|
"header5": "Header5",\
|
|
"header6": "Header6",\
|
|
"list": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]\
|
|
};\
|
|
\
|
|
var tpl =\
|
|
"<div>" +\
|
|
"<h1 class=\'header1\'><%= header1 %></h1>" +\
|
|
"<h2 class=\'header2\'><%= header2 %></h2>" +\
|
|
"<h3 class=\'header3\'><%= header3 %></h3>" +\
|
|
"<h4 class=\'header4\'><%= header4 %></h4>" +\
|
|
"<h5 class=\'header5\'><%= header5 %></h5>" +\
|
|
"<h6 class=\'header6\'><%= header6 %></h6>" +\
|
|
"<ul class=\'list\'>" +\
|
|
"<% for (var index = 0, length = list.length; index < length; index++) { %>" +\
|
|
"<li class=\'item\'><%= list[index] %></li>" +\
|
|
"<% } %>" +\
|
|
"</ul>" +\
|
|
"</div>";\
|
|
\
|
|
var tplVerbose =\
|
|
"<div>" +\
|
|
"<h1 class=\'header1\'><%= data.header1 %></h1>" +\
|
|
"<h2 class=\'header2\'><%= data.header2 %></h2>" +\
|
|
"<h3 class=\'header3\'><%= data.header3 %></h3>" +\
|
|
"<h4 class=\'header4\'><%= data.header4 %></h4>" +\
|
|
"<h5 class=\'header5\'><%= data.header5 %></h5>" +\
|
|
"<h6 class=\'header6\'><%= data.header6 %></h6>" +\
|
|
"<ul class=\'list\'>" +\
|
|
"<% for (var index = 0, length = data.list.length; index < length; index++) { %>" +\
|
|
"<li class=\'item\'><%= data.list[index] %></li>" +\
|
|
"<% } %>" +\
|
|
"</ul>" +\
|
|
"</div>";\
|
|
\
|
|
var settingsObject = { "variable": "data" };\
|
|
\
|
|
var _tpl = _.template(tpl),\
|
|
_tplVerbose = _.template(tplVerbose, null, settingsObject);\
|
|
\
|
|
var lodashTpl = lodash.template(tpl),\
|
|
lodashTplVerbose = lodash.template(tplVerbose, null, settingsObject);\
|
|
}\
|
|
if (typeof wrap != "undefined") {\
|
|
var add = function(a, b) {\
|
|
return a + b;\
|
|
};\
|
|
\
|
|
var average = function(func, a, b) {\
|
|
return (func(a, b) / 2).toFixed(2);\
|
|
};\
|
|
\
|
|
var _wrapped = _.wrap(add, average);\
|
|
lodashWrapped = lodash.wrap(add, average);\
|
|
}\
|
|
if (typeof zip != "undefined") {\
|
|
var unzipped = [["a", "b", "c"], [1, 2, 3], [true, false, true]];\
|
|
}'
|
|
});
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_(...).map(...).filter(...).take(...).value()`')
|
|
.add(buildName, {
|
|
'fn': 'lodashChaining.map(square).filter(even).take(100).value()',
|
|
'teardown': 'function chaining(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_chaining.map(square).filter(even).take(100).value()',
|
|
'teardown': 'function chaining(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.assign`')
|
|
.add(buildName, {
|
|
'fn': 'lodashAssign({}, { "a": 1, "b": 2, "c": 3 })',
|
|
'teardown': 'function assign(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_assign({}, { "a": 1, "b": 2, "c": 3 })',
|
|
'teardown': 'function assign(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.assign` with multiple sources')
|
|
.add(buildName, {
|
|
'fn': 'lodashAssign({}, { "a": 1, "b": 2 }, { "c": 3, "d": 4 })',
|
|
'teardown': 'function assign(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_assign({}, { "a": 1, "b": 2 }, { "c": 3, "d": 4 })',
|
|
'teardown': 'function assign(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.bind` (slow path)')
|
|
.add(buildName, {
|
|
'fn': 'lodash.bind(function() { return this.name; }, { "name": "fred" })',
|
|
'teardown': 'function bind(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.bind(function() { return this.name; }, { "name": "fred" })',
|
|
'teardown': 'function bind(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('bound call with arguments')
|
|
.add(buildName, {
|
|
'fn': 'lodashBoundNormal("hi", "!")',
|
|
'teardown': 'function bind(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_boundNormal("hi", "!")',
|
|
'teardown': 'function bind(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('bound and partially applied call with arguments')
|
|
.add(buildName, {
|
|
'fn': 'lodashBoundPartial("!")',
|
|
'teardown': 'function bind(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_boundPartial("!")',
|
|
'teardown': 'function bind(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('bound multiple times')
|
|
.add(buildName, {
|
|
'fn': 'lodashBoundMultiple()',
|
|
'teardown': 'function bind(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_boundMultiple()',
|
|
'teardown': 'function bind(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.bindAll`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.bindAll(bindAllObjects[++bindAllCount], funcNames)',
|
|
'teardown': 'function bindAll(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.bindAll(bindAllObjects[++bindAllCount], funcNames)',
|
|
'teardown': 'function bindAll(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.clone` with an array')
|
|
.add(buildName, '\
|
|
lodash.clone(numbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.clone(numbers)'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.clone` with an object')
|
|
.add(buildName, '\
|
|
lodash.clone(object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.clone(object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.compact`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.compact(uncompacted)',
|
|
'teardown': 'function compact(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.compact(uncompacted)',
|
|
'teardown': 'function compact(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.countBy` with `callback` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.countBy(numbers, function(num) { return num >> 1; })'
|
|
)
|
|
.add(otherName, '\
|
|
_.countBy(numbers, function(num) { return num >> 1; })'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.countBy` with `property` name iterating an array')
|
|
.add(buildName, {
|
|
'fn': 'lodash.countBy(words, "length")',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.countBy(words, "length")',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.countBy` with `callback` iterating an object')
|
|
.add(buildName, {
|
|
'fn': 'lodash.countBy(wordToNumber, function(num) { return num >> 1; })',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.countBy(wordToNumber, function(num) { return num >> 1; })',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.defaults`')
|
|
.add(buildName, '\
|
|
lodash.defaults({ "key2": 2, "key6": 6, "key18": 18 }, object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.defaults({ "key2": 2, "key6": 6, "key18": 18 }, object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.difference`')
|
|
.add(buildName, '\
|
|
lodash.difference(numbers, twoNumbers, fourNumbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.difference(numbers, twoNumbers, fourNumbers)'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.difference` iterating 20 and 40 elements')
|
|
.add(buildName, {
|
|
'fn': 'lodash.difference(twentyValues, fortyValues)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.difference(twentyValues, fortyValues)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.difference` iterating 200 elements')
|
|
.add(buildName, {
|
|
'fn': 'lodash.difference(twoHundredValues, twoHundredValues2)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.difference(twoHundredValues, twoHundredValues2)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.each` iterating an array')
|
|
.add(buildName, '\
|
|
var result = [];\
|
|
lodash.each(numbers, function(num) {\
|
|
result.push(num * 2);\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
var result = [];\
|
|
_.each(numbers, function(num) {\
|
|
result.push(num * 2);\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.each` iterating an object')
|
|
.add(buildName, '\
|
|
var result = [];\
|
|
lodash.each(object, function(num) {\
|
|
result.push(num * 2);\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
var result = [];\
|
|
_.each(object, function(num) {\
|
|
result.push(num * 2);\
|
|
})'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.every` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.every(numbers, function(num) {\
|
|
return num < limit;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.every(numbers, function(num) {\
|
|
return num < limit;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.every` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.every(object, function(num) {\
|
|
return num < limit;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.every(object, function(num) {\
|
|
return num < limit;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.filter` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.filter(numbers, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.filter(numbers, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.filter` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.filter(object, function(num) {\
|
|
return num % 2\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.filter(object, function(num) {\
|
|
return num % 2\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.filter` with `_.matches` shorthand')
|
|
.add(buildName, {
|
|
'fn': 'lodash.filter(objects, source)',
|
|
'teardown': 'function matches(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.filter(objects, source)',
|
|
'teardown': 'function matches(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.filter` with `_.matches` predicate')
|
|
.add(buildName, {
|
|
'fn': 'lodash.filter(objects, lodashMatcher)',
|
|
'teardown': 'function matches(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.filter(objects, _matcher)',
|
|
'teardown': 'function matches(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.find` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.find(numbers, function(num) {\
|
|
return num === (limit - 1);\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.find(numbers, function(num) {\
|
|
return num === (limit - 1);\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.find` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.find(object, function(value, key) {\
|
|
return /\D9$/.test(key);\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.find(object, function(value, key) {\
|
|
return /\D9$/.test(key);\
|
|
})'
|
|
)
|
|
);
|
|
|
|
// Avoid Underscore induced `OutOfMemoryError` in Rhino and Ringo.
|
|
suites.push(
|
|
Benchmark.Suite('`_.find` with `_.matches` shorthand')
|
|
.add(buildName, {
|
|
'fn': 'lodash.find(objects, source)',
|
|
'teardown': 'function matches(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.find(objects, source)',
|
|
'teardown': 'function matches(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.flatten`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.flatten(nestedNumbers, !lodashFlattenDeep)',
|
|
'teardown': 'function flatten(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.flatten(nestedNumbers, !_flattenDeep)',
|
|
'teardown': 'function flatten(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.flattenDeep` nested arrays of numbers')
|
|
.add(buildName, {
|
|
'fn': 'lodash.flattenDeep(nestedNumbers)',
|
|
'teardown': 'function flatten(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.flattenDeep(nestedNumbers)',
|
|
'teardown': 'function flatten(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.flattenDeep` nest arrays of objects')
|
|
.add(buildName, {
|
|
'fn': 'lodash.flattenDeep(nestedObjects)',
|
|
'teardown': 'function flatten(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.flattenDeep(nestedObjects)',
|
|
'teardown': 'function flatten(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.flowRight`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.flowRight(compAddThree, compAddTwo, compAddOne)',
|
|
'teardown': 'function flowRight(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.flowRight(compAddThree, compAddTwo, compAddOne)',
|
|
'teardown': 'function flowRight(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('composed call')
|
|
.add(buildName, {
|
|
'fn': 'lodashComposed(0)',
|
|
'teardown': 'function flowRight(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_composed(0)',
|
|
'teardown': 'function flowRight(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.functions`')
|
|
.add(buildName, '\
|
|
lodash.functions(lodash)'
|
|
)
|
|
.add(otherName, '\
|
|
_.functions(lodash)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.groupBy` with `callback` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.groupBy(numbers, function(num) { return num >> 1; })'
|
|
)
|
|
.add(otherName, '\
|
|
_.groupBy(numbers, function(num) { return num >> 1; })'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.groupBy` with `property` name iterating an array')
|
|
.add(buildName, {
|
|
'fn': 'lodash.groupBy(words, "length")',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.groupBy(words, "length")',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.groupBy` with `callback` iterating an object')
|
|
.add(buildName, {
|
|
'fn': 'lodash.groupBy(wordToNumber, function(num) { return num >> 1; })',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.groupBy(wordToNumber, function(num) { return num >> 1; })',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.includes` searching an array')
|
|
.add(buildName, '\
|
|
lodash.includes(numbers, limit - 1)'
|
|
)
|
|
.add(otherName, '\
|
|
_.includes(numbers, limit - 1)'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.includes` searching an object')
|
|
.add(buildName, '\
|
|
lodash.includes(object, limit - 1)'
|
|
)
|
|
.add(otherName, '\
|
|
_.includes(object, limit - 1)'
|
|
)
|
|
);
|
|
|
|
if (lodash.includes('ab', 'ab') && _.includes('ab', 'ab')) {
|
|
suites.push(
|
|
Benchmark.Suite('`_.includes` searching a string')
|
|
.add(buildName, '\
|
|
lodash.includes(strNumbers, "," + (limit - 1))'
|
|
)
|
|
.add(otherName, '\
|
|
_.includes(strNumbers, "," + (limit - 1))'
|
|
)
|
|
);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.indexOf`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.indexOf(hundredSortedValues, 99)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.indexOf(hundredSortedValues, 99)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.intersection`')
|
|
.add(buildName, '\
|
|
lodash.intersection(numbers, twoNumbers, fourNumbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.intersection(numbers, twoNumbers, fourNumbers)'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.intersection` iterating 120 elements')
|
|
.add(buildName, {
|
|
'fn': 'lodash.intersection(hundredTwentyValues, hundredTwentyValues2)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.intersection(hundredTwentyValues, hundredTwentyValues2)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.invert`')
|
|
.add(buildName, '\
|
|
lodash.invert(object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.invert(object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.invokeMap` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.invokeMap(numbers, "toFixed")'
|
|
)
|
|
.add(otherName, '\
|
|
_.invokeMap(numbers, "toFixed")'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.invokeMap` with arguments iterating an array')
|
|
.add(buildName, '\
|
|
lodash.invokeMap(numbers, "toFixed", 1)'
|
|
)
|
|
.add(otherName, '\
|
|
_.invokeMap(numbers, "toFixed", 1)'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.invokeMap` with a function for `path` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.invokeMap(numbers, Number.prototype.toFixed, 1)'
|
|
)
|
|
.add(otherName, '\
|
|
_.invokeMap(numbers, Number.prototype.toFixed, 1)'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.invokeMap` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.invokeMap(object, "toFixed", 1)'
|
|
)
|
|
.add(otherName, '\
|
|
_.invokeMap(object, "toFixed", 1)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.isEqual` comparing primitives')
|
|
.add(buildName, {
|
|
'fn': '\
|
|
lodash.isEqual(1, "1");\
|
|
lodash.isEqual(1, 1)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '\
|
|
_.isEqual(1, "1");\
|
|
_.isEqual(1, 1);',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.isEqual` comparing primitives and their object counterparts (edge case)')
|
|
.add(buildName, {
|
|
'fn': '\
|
|
lodash.isEqual(objectOfPrimitives, objectOfObjects);\
|
|
lodash.isEqual(objectOfPrimitives, objectOfObjects2)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '\
|
|
_.isEqual(objectOfPrimitives, objectOfObjects);\
|
|
_.isEqual(objectOfPrimitives, objectOfObjects2)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.isEqual` comparing arrays')
|
|
.add(buildName, {
|
|
'fn': '\
|
|
lodash.isEqual(numbers, numbers2);\
|
|
lodash.isEqual(numbers2, numbers3)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '\
|
|
_.isEqual(numbers, numbers2);\
|
|
_.isEqual(numbers2, numbers3)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.isEqual` comparing nested arrays')
|
|
.add(buildName, {
|
|
'fn': '\
|
|
lodash.isEqual(nestedNumbers, nestedNumbers2);\
|
|
lodash.isEqual(nestedNumbers2, nestedNumbers3)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '\
|
|
_.isEqual(nestedNumbers, nestedNumbers2);\
|
|
_.isEqual(nestedNumbers2, nestedNumbers3)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.isEqual` comparing arrays of objects')
|
|
.add(buildName, {
|
|
'fn': '\
|
|
lodash.isEqual(objects, objects2);\
|
|
lodash.isEqual(objects2, objects3)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '\
|
|
_.isEqual(objects, objects2);\
|
|
_.isEqual(objects2, objects3)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.isEqual` comparing objects')
|
|
.add(buildName, {
|
|
'fn': '\
|
|
lodash.isEqual(object, object2);\
|
|
lodash.isEqual(object2, object3)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '\
|
|
_.isEqual(object, object2);\
|
|
_.isEqual(object2, object3)',
|
|
'teardown': 'function isEqual(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.isArguments`, `_.isDate`, `_.isFunction`, `_.isNumber`, `_.isObject`, `_.isRegExp`')
|
|
.add(buildName, '\
|
|
lodash.isArguments(arguments);\
|
|
lodash.isArguments(object);\
|
|
lodash.isDate(date);\
|
|
lodash.isDate(object);\
|
|
lodash.isFunction(lodash);\
|
|
lodash.isFunction(object);\
|
|
lodash.isNumber(1);\
|
|
lodash.isNumber(object);\
|
|
lodash.isObject(object);\
|
|
lodash.isObject(1);\
|
|
lodash.isRegExp(regexp);\
|
|
lodash.isRegExp(object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.isArguments(arguments);\
|
|
_.isArguments(object);\
|
|
_.isDate(date);\
|
|
_.isDate(object);\
|
|
_.isFunction(_);\
|
|
_.isFunction(object);\
|
|
_.isNumber(1);\
|
|
_.isNumber(object);\
|
|
_.isObject(object);\
|
|
_.isObject(1);\
|
|
_.isRegExp(regexp);\
|
|
_.isRegExp(object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.keys` (uses native `Object.keys` if available)')
|
|
.add(buildName, '\
|
|
lodash.keys(object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.keys(object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.lastIndexOf`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.lastIndexOf(hundredSortedValues, 0)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.lastIndexOf(hundredSortedValues, 0)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.map` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.map(objects, function(value) {\
|
|
return value.num;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.map(objects, function(value) {\
|
|
return value.num;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.map` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.map(object, function(value) {\
|
|
return value;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.map(object, function(value) {\
|
|
return value;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.map` with `_.property` shorthand')
|
|
.add(buildName, '\
|
|
lodash.map(objects, "num")'
|
|
)
|
|
.add(otherName, '\
|
|
_.map(objects, "num")'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.max`')
|
|
.add(buildName, '\
|
|
lodash.max(numbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.max(numbers)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.min`')
|
|
.add(buildName, '\
|
|
lodash.min(numbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.min(numbers)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.omit` iterating 20 properties, omitting 2 keys')
|
|
.add(buildName, '\
|
|
lodash.omit(object, "key6", "key13")'
|
|
)
|
|
.add(otherName, '\
|
|
_.omit(object, "key6", "key13")'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.omit` iterating 40 properties, omitting 20 keys')
|
|
.add(buildName, {
|
|
'fn': 'lodash.omit(wordToNumber, words)',
|
|
'teardown': 'function omit(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.omit(wordToNumber, words)',
|
|
'teardown': 'function omit(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.partial` (slow path)')
|
|
.add(buildName, {
|
|
'fn': 'lodash.partial(function(greeting) { return greeting + " " + this.name; }, "hi")',
|
|
'teardown': 'function partial(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.partial(function(greeting) { return greeting + " " + this.name; }, "hi")',
|
|
'teardown': 'function partial(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('partially applied call with arguments')
|
|
.add(buildName, {
|
|
'fn': 'lodashPartial("!")',
|
|
'teardown': 'function partial(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_partial("!")',
|
|
'teardown': 'function partial(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.partition` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.partition(numbers, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.partition(numbers, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.partition` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.partition(object, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.partition(object, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.pick`')
|
|
.add(buildName, '\
|
|
lodash.pick(object, "key6", "key13")'
|
|
)
|
|
.add(otherName, '\
|
|
_.pick(object, "key6", "key13")'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.reduce` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.reduce(numbers, function(result, value, index) {\
|
|
result[index] = value;\
|
|
return result;\
|
|
}, {})'
|
|
)
|
|
.add(otherName, '\
|
|
_.reduce(numbers, function(result, value, index) {\
|
|
result[index] = value;\
|
|
return result;\
|
|
}, {})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.reduce` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.reduce(object, function(result, value, key) {\
|
|
result.push(key, value);\
|
|
return result;\
|
|
}, [])'
|
|
)
|
|
.add(otherName, '\
|
|
_.reduce(object, function(result, value, key) {\
|
|
result.push(key, value);\
|
|
return result;\
|
|
}, [])'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.reduceRight` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.reduceRight(numbers, function(result, value, index) {\
|
|
result[index] = value;\
|
|
return result;\
|
|
}, {})'
|
|
)
|
|
.add(otherName, '\
|
|
_.reduceRight(numbers, function(result, value, index) {\
|
|
result[index] = value;\
|
|
return result;\
|
|
}, {})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.reduceRight` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.reduceRight(object, function(result, value, key) {\
|
|
result.push(key, value);\
|
|
return result;\
|
|
}, [])'
|
|
)
|
|
.add(otherName, '\
|
|
_.reduceRight(object, function(result, value, key) {\
|
|
result.push(key, value);\
|
|
return result;\
|
|
}, [])'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.reject` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.reject(numbers, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.reject(numbers, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.reject` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.reject(object, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.reject(object, function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.sampleSize`')
|
|
.add(buildName, '\
|
|
lodash.sampleSize(numbers, limit / 2)'
|
|
)
|
|
.add(otherName, '\
|
|
_.sampleSize(numbers, limit / 2)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.shuffle`')
|
|
.add(buildName, '\
|
|
lodash.shuffle(numbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.shuffle(numbers)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.size` with an object')
|
|
.add(buildName, '\
|
|
lodash.size(object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.size(object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.some` iterating an array')
|
|
.add(buildName, '\
|
|
lodash.some(numbers, function(num) {\
|
|
return num == (limit - 1);\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.some(numbers, function(num) {\
|
|
return num == (limit - 1);\
|
|
})'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.some` iterating an object')
|
|
.add(buildName, '\
|
|
lodash.some(object, function(num) {\
|
|
return num == (limit - 1);\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.some(object, function(num) {\
|
|
return num == (limit - 1);\
|
|
})'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.sortBy` with `callback`')
|
|
.add(buildName, '\
|
|
lodash.sortBy(numbers, function(num) { return Math.sin(num); })'
|
|
)
|
|
.add(otherName, '\
|
|
_.sortBy(numbers, function(num) { return Math.sin(num); })'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.sortBy` with `property` name')
|
|
.add(buildName, {
|
|
'fn': 'lodash.sortBy(words, "length")',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.sortBy(words, "length")',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.sortedIndex`')
|
|
.add(buildName, '\
|
|
lodash.sortedIndex(numbers, limit)'
|
|
)
|
|
.add(otherName, '\
|
|
_.sortedIndex(numbers, limit)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.sortedIndexBy`')
|
|
.add(buildName, {
|
|
'fn': '\
|
|
lodash.sortedIndexBy(words, "twenty-five", function(value) {\
|
|
return wordToNumber[value];\
|
|
})',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '\
|
|
_.sortedIndexBy(words, "twenty-five", function(value) {\
|
|
return wordToNumber[value];\
|
|
})',
|
|
'teardown': 'function countBy(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.sortedIndexOf`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.sortedIndexOf(hundredSortedValues, 99)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.sortedIndexOf(hundredSortedValues, 99)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.sortedLastIndexOf`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.sortedLastIndexOf(hundredSortedValues, 0)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.sortedLastIndexOf(hundredSortedValues, 0)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.sum`')
|
|
.add(buildName, '\
|
|
lodash.sum(numbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.sum(numbers)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.template` (slow path)')
|
|
.add(buildName, {
|
|
'fn': 'lodash.template(tpl)(tplData)',
|
|
'teardown': 'function template(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.template(tpl)(tplData)',
|
|
'teardown': 'function template(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('compiled template')
|
|
.add(buildName, {
|
|
'fn': 'lodashTpl(tplData)',
|
|
'teardown': 'function template(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_tpl(tplData)',
|
|
'teardown': 'function template(){}'
|
|
})
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('compiled template without a with-statement')
|
|
.add(buildName, {
|
|
'fn': 'lodashTplVerbose(tplData)',
|
|
'teardown': 'function template(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_tplVerbose(tplData)',
|
|
'teardown': 'function template(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.times`')
|
|
.add(buildName, '\
|
|
var result = [];\
|
|
lodash.times(limit, function(n) { result.push(n); })'
|
|
)
|
|
.add(otherName, '\
|
|
var result = [];\
|
|
_.times(limit, function(n) { result.push(n); })'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.toArray` with an array (edge case)')
|
|
.add(buildName, '\
|
|
lodash.toArray(numbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.toArray(numbers)'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.toArray` with an object')
|
|
.add(buildName, '\
|
|
lodash.toArray(object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.toArray(object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.toPairs`')
|
|
.add(buildName, '\
|
|
lodash.toPairs(object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.toPairs(object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.unescape` string without html entities')
|
|
.add(buildName, '\
|
|
lodash.unescape("`&`, `<`, `>`, `\\"`, and `\'`")'
|
|
)
|
|
.add(otherName, '\
|
|
_.unescape("`&`, `<`, `>`, `\\"`, and `\'`")'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.unescape` string with html entities')
|
|
.add(buildName, '\
|
|
lodash.unescape("`&`, `<`, `>`, `"`, and `'`")'
|
|
)
|
|
.add(otherName, '\
|
|
_.unescape("`&`, `<`, `>`, `"`, and `'`")'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.union`')
|
|
.add(buildName, '\
|
|
lodash.union(numbers, twoNumbers, fourNumbers)'
|
|
)
|
|
.add(otherName, '\
|
|
_.union(numbers, twoNumbers, fourNumbers)'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.union` iterating an array of 200 elements')
|
|
.add(buildName, {
|
|
'fn': 'lodash.union(hundredValues, hundredValues2)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.union(hundredValues, hundredValues2)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.uniq`')
|
|
.add(buildName, '\
|
|
lodash.uniq(numbers.concat(twoNumbers, fourNumbers))'
|
|
)
|
|
.add(otherName, '\
|
|
_.uniq(numbers.concat(twoNumbers, fourNumbers))'
|
|
)
|
|
);
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.uniq` iterating an array of 200 elements')
|
|
.add(buildName, {
|
|
'fn': 'lodash.uniq(twoHundredValues)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.uniq(twoHundredValues)',
|
|
'teardown': 'function multiArrays(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.uniqBy`')
|
|
.add(buildName, '\
|
|
lodash.uniqBy(numbers.concat(twoNumbers, fourNumbers), function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
.add(otherName, '\
|
|
_.uniqBy(numbers.concat(twoNumbers, fourNumbers), function(num) {\
|
|
return num % 2;\
|
|
})'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.values`')
|
|
.add(buildName, '\
|
|
lodash.values(object)'
|
|
)
|
|
.add(otherName, '\
|
|
_.values(object)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.without`')
|
|
.add(buildName, '\
|
|
lodash.without(numbers, 9, 12, 14, 15)'
|
|
)
|
|
.add(otherName, '\
|
|
_.without(numbers, 9, 12, 14, 15)'
|
|
)
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.wrap` result called')
|
|
.add(buildName, {
|
|
'fn': 'lodashWrapped(2, 5)',
|
|
'teardown': 'function wrap(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_wrapped(2, 5)',
|
|
'teardown': 'function wrap(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
suites.push(
|
|
Benchmark.Suite('`_.zip`')
|
|
.add(buildName, {
|
|
'fn': 'lodash.zip.apply(lodash, unzipped)',
|
|
'teardown': 'function zip(){}'
|
|
})
|
|
.add(otherName, {
|
|
'fn': '_.zip.apply(_, unzipped)',
|
|
'teardown': 'function zip(){}'
|
|
})
|
|
);
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
if (Benchmark.platform + '') {
|
|
log(Benchmark.platform);
|
|
}
|
|
// Expose `run` to be called later when executing in a browser.
|
|
if (document) {
|
|
root.run = run;
|
|
} else {
|
|
run();
|
|
}
|
|
}.call(this));
|