GeezerVison is showing github.com — benchmark: add a benchmark for URLSearchParams creation and toString() · nodejs/node@b5db3b5
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboard +79Lines changed: 79 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 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 | +} |
Collapse file Copy file name to clipboard +76Lines changed: 76 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| | 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 | +} |
|