querystring: avoid indexOf when parsing

Fixes a performance regression in body-parser with V8 6.0.
Removes the use of an auxiliary array, and just query the object
directly.

PR-URL: https://github.com/nodejs/node/pull/14703
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Evan Lucas <evanlucas@me.com>
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
Matteo Collina 2017-08-09 00:41:52 +02:00 committed by Myles Borins
parent 1e569f42b6
commit 7ec28a0a50
No known key found for this signature in database
GPG Key ID: 933B01F40B5CA946

View File

@ -285,7 +285,6 @@ function parse(qs, sep, eq, options) {
}
const customDecode = (decode !== qsUnescape);
const keys = [];
var lastPos = 0;
var sepIdx = 0;
var eqIdx = 0;
@ -326,11 +325,8 @@ function parse(qs, sep, eq, options) {
if (value.length > 0 && valEncoded)
value = decodeStr(value, decode);
// Use a key array lookup instead of using hasOwnProperty(), which is
// slower
if (keys.indexOf(key) === -1) {
if (obj[key] === undefined) {
obj[key] = value;
keys[keys.length] = key;
} else {
const curValue = obj[key];
// A simple Array-specific property check is enough here to
@ -428,10 +424,8 @@ function parse(qs, sep, eq, options) {
key = decodeStr(key, decode);
if (value.length > 0 && valEncoded)
value = decodeStr(value, decode);
// Use a key array lookup instead of using hasOwnProperty(), which is slower
if (keys.indexOf(key) === -1) {
if (obj[key] === undefined) {
obj[key] = value;
keys[keys.length] = key;
} else {
const curValue = obj[key];
// A simple Array-specific property check is enough here to