diff options
author | Debadree Chatterjee <debadree333@gmail.com> | 2023-03-13 16:07:41 +0530 |
---|---|---|
committer | Danielle Adams <adamzdanielle@gmail.com> | 2023-04-10 22:18:19 -0400 |
commit | b5db3b579a1dda705b25ca796cf61402db81a7b4 (patch) | |
tree | c9f4db9035516088d3ba774e413bb34ef47d73dc | |
parent | bce37c60cec3258d26c497fadc9a192158d39305 (diff) | |
download | node-new-b5db3b579a1dda705b25ca796cf61402db81a7b4.tar.gz |
benchmark: add a benchmark for URLSearchParams creation and toString()
Refs: https://github.com/nodejs/performance/issues/56
PR-URL: https://github.com/nodejs/node/pull/46810
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
-rw-r--r-- | benchmark/url/url-searchparams-creation.js | 79 | ||||
-rw-r--r-- | benchmark/url/url-searchparams-toString.js | 76 |
2 files changed, 155 insertions, 0 deletions
diff --git a/benchmark/url/url-searchparams-creation.js b/benchmark/url/url-searchparams-creation.js new file mode 100644 index 0000000000..1cc51ed7db --- /dev/null +++ b/benchmark/url/url-searchparams-creation.js @@ -0,0 +1,79 @@ +'use strict'; +const common = require('../common.js'); + +const values = { + noencode: { + foo: 'bar', + baz: 'quux', + xyzzy: 'thud', + }, + encodemany: { + '\u0080\u0083\u0089': 'bar', + '\u008C\u008E\u0099': 'quux', + 'xyzzy': '\u00A5q\u00A3r', + }, + encodelast: { + foo: 'bar', + baz: 'quux', + xyzzy: 'thu\u00AC', + }, + array: { + foo: [], + baz: ['bar'], + xyzzy: ['bar', 'quux', 'thud'], + }, + multiprimitives: { + foo: false, + bar: -13.37, + baz: 'baz', + }, +}; + +function paramGenerator(paramType) { + const valueKeys = Object.keys(values); + switch (paramType) { + case 'string': + // Return the values object with all values as strings + return valueKeys.reduce((acc, key) => { + acc[key] = Object.keys(values[key]).reduce((acc, k, i) => { + acc += `${k}=${values[key][k]}${i < valueKeys.length - 1 ? '&' : ''}`; + return acc; + }, ''); + return acc; + }, {}); + case 'iterable': + // Return the values object with all values as iterable + return valueKeys.reduce((acc, key) => { + acc[key] = Object.keys(values[key]).reduce((acc, k) => { + acc.push([k, values[key][k]]); + return acc; + }, []); + return acc; + }, {}); + case 'object': + // Return the values object with all values as objects + return values; + default: + } +} + +const bench = common.createBenchmark(main, { + type: ['noencode', 'encodemany', 'encodelast', 'array', 'multiprimitives'], + inputType: ['string', 'iterable', 'object'], + n: [1e6], +}); + +function main({ n, type, inputType }) { + const inputs = paramGenerator(inputType); + const input = inputs[type]; + + // Force optimization before starting the benchmark + for (const name in inputs) { + new URLSearchParams(inputs[name]); + } + + bench.start(); + for (let i = 0; i < n; i += 1) + new URLSearchParams(input); + bench.end(n); +} diff --git a/benchmark/url/url-searchparams-toString.js b/benchmark/url/url-searchparams-toString.js new file mode 100644 index 0000000000..04551d1965 --- /dev/null +++ b/benchmark/url/url-searchparams-toString.js @@ -0,0 +1,76 @@ +'use strict'; +const common = require('../common.js'); + +const values = { + noencode: { + foo: 'bar', + baz: 'quux', + xyzzy: 'thud', + }, + encodemany: { + '\u0080\u0083\u0089': 'bar', + '\u008C\u008E\u0099': 'quux', + 'xyzzy': '\u00A5q\u00A3r', + }, + encodelast: { + foo: 'bar', + baz: 'quux', + xyzzy: 'thu\u00AC', + }, + array: { + foo: [], + baz: ['bar'], + xyzzy: ['bar', 'quux', 'thud'], + }, + multiprimitives: { + foo: false, + bar: -13.37, + baz: 'baz', + }, +}; + +function paramGenerator(paramType) { + const valueKeys = Object.keys(values); + switch (paramType) { + case 'string': + // Return the values object with all values as strings + return valueKeys.reduce((acc, key) => { + const objectKeys = Object.keys(values[key]); + acc[key] = objectKeys.reduce((acc, k, i) => { + acc += `${k}=${values[key][k]}${i < objectKeys.length - 1 ? '&' : ''}`; + return acc; + }, ''); + return acc; + }, {}); + case 'iterable': + // Return the values object with all values as iterable + return valueKeys.reduce((acc, key) => { + acc[key] = Object.keys(values[key]).reduce((acc, k) => { + acc.push([k, values[key][k]]); + return acc; + }, []); + return acc; + }, {}); + case 'object': + // Return the values object with all values as objects + return values; + default: + } +} + +const bench = common.createBenchmark(main, { + type: ['noencode', 'encodemany', 'encodelast', 'array', 'multiprimitives'], + inputType: ['string', 'iterable', 'object'], + n: [1e6], +}); + +function main({ n, type, inputType }) { + const inputs = paramGenerator(inputType); + const input = inputs[type]; + const u = new URLSearchParams(input); + + bench.start(); + for (let i = 0; i < n; i += 1) + u.toString(); + bench.end(n); +} |