mirror of https://github.com/lukechilds/node.git
Browse Source
Add benchmarks to compare the performance between URLSearchParams and querystring, remove duplicate benchmarks. PR-URL: https://github.com/nodejs/node/pull/11170 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Timothy Gu <timothygu99@gmail.com>v7.x
committed by
Italo A. Casas
4 changed files with 126 additions and 66 deletions
@ -0,0 +1,62 @@ |
|||||
|
'use strict'; |
||||
|
const common = require('../common.js'); |
||||
|
const { URLSearchParams } = require('url'); |
||||
|
const querystring = require('querystring'); |
||||
|
|
||||
|
const inputs = { |
||||
|
noencode: 'foo=bar&baz=quux&xyzzy=thud', |
||||
|
encodemany: '%66%6F%6F=bar&%62%61%7A=quux&xyzzy=%74h%75d', |
||||
|
encodefake: 'foo=%©ar&baz=%A©uux&xyzzy=%©ud', |
||||
|
encodelast: 'foo=bar&baz=quux&xyzzy=thu%64', |
||||
|
multicharsep: 'foo=bar&&&&&&&&&&baz=quux&&&&&&&&&&xyzzy=thud', |
||||
|
multivalue: 'foo=bar&foo=baz&foo=quux&quuy=quuz', |
||||
|
multivaluemany: 'foo=bar&foo=baz&foo=quux&quuy=quuz&foo=abc&foo=def&' + |
||||
|
'foo=ghi&foo=jkl&foo=mno&foo=pqr&foo=stu&foo=vwxyz', |
||||
|
manypairs: 'a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z' |
||||
|
}; |
||||
|
|
||||
|
const bench = common.createBenchmark(main, { |
||||
|
type: Object.keys(inputs), |
||||
|
method: ['legacy', 'whatwg'], |
||||
|
n: [1e5] |
||||
|
}); |
||||
|
|
||||
|
function useLegacy(n, input) { |
||||
|
querystring.parse(input); |
||||
|
bench.start(); |
||||
|
for (var i = 0; i < n; i += 1) { |
||||
|
querystring.parse(input); |
||||
|
} |
||||
|
bench.end(n); |
||||
|
} |
||||
|
|
||||
|
function useWHATWG(n, input) { |
||||
|
new URLSearchParams(input); |
||||
|
bench.start(); |
||||
|
for (var i = 0; i < n; i += 1) { |
||||
|
new URLSearchParams(input); |
||||
|
} |
||||
|
bench.end(n); |
||||
|
} |
||||
|
|
||||
|
function main(conf) { |
||||
|
const type = conf.type; |
||||
|
const n = conf.n | 0; |
||||
|
const method = conf.method; |
||||
|
|
||||
|
const input = inputs[type]; |
||||
|
if (!input) { |
||||
|
throw new Error('Unknown input type'); |
||||
|
} |
||||
|
|
||||
|
switch (method) { |
||||
|
case 'legacy': |
||||
|
useLegacy(n, input); |
||||
|
break; |
||||
|
case 'whatwg': |
||||
|
useWHATWG(n, input); |
||||
|
break; |
||||
|
default: |
||||
|
throw new Error('Unknown method'); |
||||
|
} |
||||
|
} |
@ -0,0 +1,64 @@ |
|||||
|
'use strict'; |
||||
|
const common = require('../common.js'); |
||||
|
const { URLSearchParams } = require('url'); |
||||
|
const querystring = require('querystring'); |
||||
|
|
||||
|
const inputs = { |
||||
|
noencode: 'foo=bar&baz=quux&xyzzy=thud', |
||||
|
encodemany: '%66%6F%6F=bar&%62%61%7A=quux&xyzzy=%74h%75d', |
||||
|
encodefake: 'foo=%©ar&baz=%A©uux&xyzzy=%©ud', |
||||
|
encodelast: 'foo=bar&baz=quux&xyzzy=thu%64', |
||||
|
multicharsep: 'foo=bar&&&&&&&&&&baz=quux&&&&&&&&&&xyzzy=thud', |
||||
|
multivalue: 'foo=bar&foo=baz&foo=quux&quuy=quuz', |
||||
|
multivaluemany: 'foo=bar&foo=baz&foo=quux&quuy=quuz&foo=abc&foo=def&' + |
||||
|
'foo=ghi&foo=jkl&foo=mno&foo=pqr&foo=stu&foo=vwxyz', |
||||
|
manypairs: 'a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z' |
||||
|
}; |
||||
|
|
||||
|
const bench = common.createBenchmark(main, { |
||||
|
type: Object.keys(inputs), |
||||
|
method: ['legacy', 'whatwg'], |
||||
|
n: [1e5] |
||||
|
}); |
||||
|
|
||||
|
function useLegacy(n, input, prop) { |
||||
|
const obj = querystring.parse(input); |
||||
|
querystring.stringify(obj); |
||||
|
bench.start(); |
||||
|
for (var i = 0; i < n; i += 1) { |
||||
|
querystring.stringify(obj); |
||||
|
} |
||||
|
bench.end(n); |
||||
|
} |
||||
|
|
||||
|
function useWHATWG(n, input, prop) { |
||||
|
const obj = new URLSearchParams(input); |
||||
|
obj.toString(); |
||||
|
bench.start(); |
||||
|
for (var i = 0; i < n; i += 1) { |
||||
|
obj.toString(); |
||||
|
} |
||||
|
bench.end(n); |
||||
|
} |
||||
|
|
||||
|
function main(conf) { |
||||
|
const type = conf.type; |
||||
|
const n = conf.n | 0; |
||||
|
const method = conf.method; |
||||
|
|
||||
|
const input = inputs[type]; |
||||
|
if (!input) { |
||||
|
throw new Error('Unknown input type'); |
||||
|
} |
||||
|
|
||||
|
switch (method) { |
||||
|
case 'legacy': |
||||
|
useLegacy(n, input); |
||||
|
break; |
||||
|
case 'whatwg': |
||||
|
useWHATWG(n, input); |
||||
|
break; |
||||
|
default: |
||||
|
throw new Error('Unknown method'); |
||||
|
} |
||||
|
} |
@ -1,31 +0,0 @@ |
|||||
'use strict'; |
|
||||
const common = require('../common.js'); |
|
||||
const { URLSearchParams } = require('url'); |
|
||||
|
|
||||
const inputs = { |
|
||||
noencode: 'foo=bar&baz=quux&xyzzy=thud', |
|
||||
// multicharsep: 'foo=bar&&&&&&&&&&baz=quux&&&&&&&&&&xyzzy=thud',
|
|
||||
multicharsep: '&&&&&&&&&&&&&&&&&&&&&&&&&&&&', |
|
||||
encodemany: '%66%6F%6F=bar&%62%61%7A=quux&xyzzy=%74h%75d', |
|
||||
encodelast: 'foo=bar&baz=quux&xyzzy=thu%64', |
|
||||
multivalue: 'foo=bar&foo=baz&foo=quux&quuy=quuz', |
|
||||
multivaluemany: 'foo=bar&foo=baz&foo=quux&quuy=quuz&foo=abc&foo=def&' + |
|
||||
'foo=ghi&foo=jkl&foo=mno&foo=pqr&foo=stu&foo=vwxyz', |
|
||||
manypairs: 'a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z' |
|
||||
}; |
|
||||
|
|
||||
const bench = common.createBenchmark(main, { |
|
||||
type: Object.keys(inputs), |
|
||||
n: [1e5] |
|
||||
}); |
|
||||
|
|
||||
function main(conf) { |
|
||||
const input = inputs[conf.type]; |
|
||||
const n = conf.n | 0; |
|
||||
|
|
||||
var i; |
|
||||
bench.start(); |
|
||||
for (i = 0; i < n; i++) |
|
||||
new URLSearchParams(input); |
|
||||
bench.end(n); |
|
||||
} |
|
@ -1,35 +0,0 @@ |
|||||
'use strict'; |
|
||||
const common = require('../common.js'); |
|
||||
const Buffer = require('buffer').Buffer; |
|
||||
const { URLSearchParams } = require('url'); |
|
||||
|
|
||||
const inputs = { |
|
||||
noencode: 'foo=bar&baz=quux&xyzzy=thud', |
|
||||
// multicharsep: 'foo=bar&&&&&&&&&&baz=quux&&&&&&&&&&xyzzy=thud',
|
|
||||
multicharsep: '&&&&&&&&&&&&&&&&&&&&&&&&&&&&', |
|
||||
encodemany: '%66%6F%6F=bar&%62%61%7A=quux&xyzzy=%74h%75d', |
|
||||
encodelast: 'foo=bar&baz=quux&xyzzy=thu%64', |
|
||||
multivalue: 'foo=bar&foo=baz&foo=quux&quuy=quuz', |
|
||||
multivaluemany: 'foo=bar&foo=baz&foo=quux&quuy=quuz&foo=abc&foo=def&' + |
|
||||
'foo=ghi&foo=jkl&foo=mno&foo=pqr&foo=stu&foo=vwxyz', |
|
||||
manypairs: 'a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z' |
|
||||
}; |
|
||||
|
|
||||
const bench = common.createBenchmark(main, { |
|
||||
type: Object.keys(inputs), |
|
||||
n: [1e5] |
|
||||
}); |
|
||||
|
|
||||
function main(conf) { |
|
||||
const input = inputs[conf.type]; |
|
||||
const n = conf.n | 0; |
|
||||
|
|
||||
const params = new URLSearchParams(input); |
|
||||
|
|
||||
bench.start(); |
|
||||
// Using Buffer.from to prevent JS version from cheating with ropes instead
|
|
||||
// of strings
|
|
||||
for (var i = 0; i < n; i += 1) |
|
||||
Buffer.from(params.toString()); |
|
||||
bench.end(n); |
|
||||
} |
|
Loading…
Reference in new issue