Skip to content

Commit b5db3b5

Browse files
debadree25danielleadams
authored andcommitted
benchmark: add a benchmark for URLSearchParams creation and toString()
Refs: nodejs/performance#56 PR-URL: #46810 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Daijiro Wachi <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
1 parent bce37c6 commit b5db3b5

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-0
lines changed
+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
'use strict';
2+
const common = require('../common.js');
3+
4+
const values = {
5+
noencode: {
6+
foo: 'bar',
7+
baz: 'quux',
8+
xyzzy: 'thud',
9+
},
10+
encodemany: {
11+
'\u0080\u0083\u0089': 'bar',
12+
'\u008C\u008E\u0099': 'quux',
13+
'xyzzy': '\u00A5q\u00A3r',
14+
},
15+
encodelast: {
16+
foo: 'bar',
17+
baz: 'quux',
18+
xyzzy: 'thu\u00AC',
19+
},
20+
array: {
21+
foo: [],
22+
baz: ['bar'],
23+
xyzzy: ['bar', 'quux', 'thud'],
24+
},
25+
multiprimitives: {
26+
foo: false,
27+
bar: -13.37,
28+
baz: 'baz',
29+
},
30+
};
31+
32+
function paramGenerator(paramType) {
33+
const valueKeys = Object.keys(values);
34+
switch (paramType) {
35+
case 'string':
36+
// Return the values object with all values as strings
37+
return valueKeys.reduce((acc, key) => {
38+
acc[key] = Object.keys(values[key]).reduce((acc, k, i) => {
39+
acc += `${k}=${values[key][k]}${i < valueKeys.length - 1 ? '&' : ''}`;
40+
return acc;
41+
}, '');
42+
return acc;
43+
}, {});
44+
case 'iterable':
45+
// Return the values object with all values as iterable
46+
return valueKeys.reduce((acc, key) => {
47+
acc[key] = Object.keys(values[key]).reduce((acc, k) => {
48+
acc.push([k, values[key][k]]);
49+
return acc;
50+
}, []);
51+
return acc;
52+
}, {});
53+
case 'object':
54+
// Return the values object with all values as objects
55+
return values;
56+
default:
57+
}
58+
}
59+
60+
const bench = common.createBenchmark(main, {
61+
type: ['noencode', 'encodemany', 'encodelast', 'array', 'multiprimitives'],
62+
inputType: ['string', 'iterable', 'object'],
63+
n: [1e6],
64+
});
65+
66+
function main({ n, type, inputType }) {
67+
const inputs = paramGenerator(inputType);
68+
const input = inputs[type];
69+
70+
// Force optimization before starting the benchmark
71+
for (const name in inputs) {
72+
new URLSearchParams(inputs[name]);
73+
}
74+
75+
bench.start();
76+
for (let i = 0; i < n; i += 1)
77+
new URLSearchParams(input);
78+
bench.end(n);
79+
}
+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
'use strict';
2+
const common = require('../common.js');
3+
4+
const values = {
5+
noencode: {
6+
foo: 'bar',
7+
baz: 'quux',
8+
xyzzy: 'thud',
9+
},
10+
encodemany: {
11+
'\u0080\u0083\u0089': 'bar',
12+
'\u008C\u008E\u0099': 'quux',
13+
'xyzzy': '\u00A5q\u00A3r',
14+
},
15+
encodelast: {
16+
foo: 'bar',
17+
baz: 'quux',
18+
xyzzy: 'thu\u00AC',
19+
},
20+
array: {
21+
foo: [],
22+
baz: ['bar'],
23+
xyzzy: ['bar', 'quux', 'thud'],
24+
},
25+
multiprimitives: {
26+
foo: false,
27+
bar: -13.37,
28+
baz: 'baz',
29+
},
30+
};
31+
32+
function paramGenerator(paramType) {
33+
const valueKeys = Object.keys(values);
34+
switch (paramType) {
35+
case 'string':
36+
// Return the values object with all values as strings
37+
return valueKeys.reduce((acc, key) => {
38+
const objectKeys = Object.keys(values[key]);
39+
acc[key] = objectKeys.reduce((acc, k, i) => {
40+
acc += `${k}=${values[key][k]}${i < objectKeys.length - 1 ? '&' : ''}`;
41+
return acc;
42+
}, '');
43+
return acc;
44+
}, {});
45+
case 'iterable':
46+
// Return the values object with all values as iterable
47+
return valueKeys.reduce((acc, key) => {
48+
acc[key] = Object.keys(values[key]).reduce((acc, k) => {
49+
acc.push([k, values[key][k]]);
50+
return acc;
51+
}, []);
52+
return acc;
53+
}, {});
54+
case 'object':
55+
// Return the values object with all values as objects
56+
return values;
57+
default:
58+
}
59+
}
60+
61+
const bench = common.createBenchmark(main, {
62+
type: ['noencode', 'encodemany', 'encodelast', 'array', 'multiprimitives'],
63+
inputType: ['string', 'iterable', 'object'],
64+
n: [1e6],
65+
});
66+
67+
function main({ n, type, inputType }) {
68+
const inputs = paramGenerator(inputType);
69+
const input = inputs[type];
70+
const u = new URLSearchParams(input);
71+
72+
bench.start();
73+
for (let i = 0; i < n; i += 1)
74+
u.toString();
75+
bench.end(n);
76+
}

0 commit comments

Comments
 (0)