fast-querystring
Advanced tools
Comparing version 0.6.4 to 0.7.0
@@ -1,6 +0,6 @@ | ||
"use strict"; | ||
const fastDecode = require("fast-decode-uri-component"); | ||
const plusRegex = /\+/g; | ||
const Empty = function () {}; | ||
Empty.prototype = Object.create(null); | ||
@@ -12,3 +12,5 @@ /** | ||
function parse(input) { | ||
const result = Object.create(null); | ||
// Optimization: Use new Empty() instead of Object.create(null) for performance | ||
// v8 has a better optimization for initializing functions compared to Object | ||
const result = new Empty(); | ||
@@ -19,3 +21,3 @@ if (typeof input !== "string") { | ||
const inputLength = input.length; | ||
let inputLength = input.length; | ||
let key = ""; | ||
@@ -42,9 +44,4 @@ let value = ""; | ||
// Only update value if '=' exists in the current range | ||
if (hasBothKeyValuePair) { | ||
value = input.slice(equalityIndex + 1, i); | ||
} | ||
// Add key/value pair only if the range size is greater than 1; a.k.a. contains at least "=" | ||
if (hasBothKeyValuePair || i - startingIndex > 1) { | ||
if (hasBothKeyValuePair || key.length > 0) { | ||
// Optimization: Replace '+' with space | ||
@@ -61,2 +58,4 @@ if (keyHasPlus) { | ||
if (hasBothKeyValuePair) { | ||
value = input.slice(equalityIndex + 1, i); | ||
if (valueHasPlus) { | ||
@@ -70,8 +69,7 @@ value = value.replace(plusRegex, " "); | ||
} | ||
const currentValue = result[key]; | ||
if (result[key] === undefined) { | ||
if (currentValue === undefined) { | ||
result[key] = value; | ||
} else { | ||
const currentValue = result[key]; | ||
// Optimization: value.pop is faster than Array.isArray(value) | ||
@@ -94,11 +92,11 @@ if (currentValue.pop) { | ||
valueHasPlus = false; | ||
hasBothKeyValuePair = false; | ||
} | ||
// Check '=' | ||
else if (c === 61) { | ||
if (equalityIndex <= startingIndex) { | ||
equalityIndex = i; | ||
} | ||
// If '=' character occurs again, we should decode the input. | ||
if (equalityIndex > startingIndex) { | ||
else { | ||
shouldDecodeValue = true; | ||
} else { | ||
equalityIndex = i; | ||
} | ||
@@ -108,6 +106,6 @@ } | ||
else if (c === 43) { | ||
if (equalityIndex <= startingIndex) { | ||
if (equalityIndex > startingIndex) { | ||
valueHasPlus = true; | ||
} else { | ||
keyHasPlus = true; | ||
} else { | ||
valueHasPlus = true; | ||
} | ||
@@ -117,6 +115,6 @@ } | ||
else if (c === 37) { | ||
if (equalityIndex <= startingIndex) { | ||
if (equalityIndex > startingIndex) { | ||
shouldDecodeValue = true; | ||
} else { | ||
shouldDecodeKey = true; | ||
} else { | ||
shouldDecodeValue = true; | ||
} | ||
@@ -123,0 +121,0 @@ } |
{ | ||
"name": "fast-querystring", | ||
"version": "0.6.4", | ||
"description": "", | ||
"version": "0.7.0", | ||
"description": "A fast alternative to legacy querystring module", | ||
"main": "lib/index.js", | ||
@@ -10,3 +10,3 @@ "type": "commonjs", | ||
"format": "rome format . --write", | ||
"format:ci": "rome format .", | ||
"format:ci": "rome ci .", | ||
"test": "vitest", | ||
@@ -26,2 +26,3 @@ "test:watch": "vitest --watch", | ||
"devDependencies": { | ||
"@aws-sdk/querystring-builder": "^3.162.0", | ||
"@aws-sdk/querystring-parser": "^3.162.0", | ||
@@ -34,3 +35,4 @@ "@types/node": "^18.7.15", | ||
"querystringify": "^2.2.0", | ||
"rome": "0.9.0-next", | ||
"querystringparser": "^0.1.1", | ||
"rome": "0.9.1-next", | ||
"vitest": "^0.23.1" | ||
@@ -37,0 +39,0 @@ }, |
# fast-querystring | ||
Fast query-string parser to replace the legacy `node:querystring` parse & stringify functions. | ||
Fast query-string parser and stringifier to replace the legacy `node:querystring` module. | ||
@@ -51,13 +51,14 @@ ### Installation | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ qs โ 10000 โ 317841.53 op/sec โ ยฑ 1.18 % โ | ||
โ query-string โ 10000 โ 341009.91 op/sec โ ยฑ 1.06 % โ | ||
โ querystringify โ 1000 โ 451609.79 op/sec โ ยฑ 0.61 % โ | ||
โ @aws-sdk/querystring-parser โ 1000 โ 477241.09 op/sec โ ยฑ 0.69 % โ | ||
โ URLSearchParams-with-Object.fromEntries โ 10000 โ 870095.07 op/sec โ ยฑ 3.29 % โ | ||
โ URLSearchParams-with-construct โ 10000 โ 1232650.60 op/sec โ ยฑ 2.95 % โ | ||
โ node:querystring โ 10000 โ 1462802.04 op/sec โ ยฑ 3.69 % โ | ||
โ qs โ 10000 โ 302595.31 op/sec โ ยฑ 1.22 % โ | ||
โ query-string โ 9500 โ 334820.82 op/sec โ ยฑ 0.99 % โ | ||
โ querystringify โ 1000 โ 437899.50 op/sec โ ยฑ 0.73 % โ | ||
โ @aws-sdk/querystring-parser โ 1000 โ 454836.96 op/sec โ ยฑ 0.69 % โ | ||
โ URLSearchParams-with-Object.fromEntries โ 1500 โ 849572.92 op/sec โ ยฑ 0.89 % โ | ||
โ URLSearchParams-with-construct โ 10000 โ 1190835.28 op/sec โ ยฑ 3.22 % โ | ||
โ node:querystring โ 10000 โ 1384717.43 op/sec โ ยฑ 2.99 % โ | ||
โ querystringparser โ 3500 โ 1735544.65 op/sec โ ยฑ 0.95 % โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ Fastest test โ Samples โ Result โ Tolerance โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ fast-querystring โ 10000 โ 1809816.84 op/sec โ ยฑ 3.19 % โ | ||
โ fast-querystring โ 10000 โ 2023187.35 op/sec โ ยฑ 2.67 % โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโงโโโโโโโโโโงโโโโโโโโโโโโโโโโโโโโงโโโโโโโโโโโโ | ||
@@ -71,16 +72,18 @@ ``` | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโโโโโโโโโโคโโโโโโโโโโโโโโโโโโโโคโโโโโโโโโโโโ | ||
โ Slower tests โ Samples โ Result โ Tolerance โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ query-string โ 10000 โ 284130.63 op/sec โ ยฑ 1.62 % โ | ||
โ qs โ 10000 โ 334799.48 op/sec โ ยฑ 1.93 % โ | ||
โ http-querystring-stringify โ 10000 โ 482642.49 op/sec โ ยฑ 1.72 % โ | ||
โ URLSearchParams โ 10000 โ 587274.65 op/sec โ ยฑ 1.88 % โ | ||
โ querystringify โ 10000 โ 753960.35 op/sec โ ยฑ 2.20 % โ | ||
โ node:querystring โ 10000 โ 1796993.95 op/sec โ ยฑ 5.34 % โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ Fastest test โ Samples โ Result โ Tolerance โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ fast-querystring โ 10000 โ 2051022.89 op/sec โ ยฑ 4.52 % โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโงโโโโโโโโโโงโโโโโโโโโโโโโโโโโโโโงโโโโโโโโโโโโ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโโโโโโโโโโคโโโโโโโโโโโโโโโโโโโโคโโโโโโโโโโโโ | ||
โ Slower tests โ Samples โ Result โ Tolerance โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ query-string โ 10000 โ 294354.42 op/sec โ ยฑ 1.25 % โ | ||
โ qs โ 10000 โ 349992.31 op/sec โ ยฑ 1.45 % โ | ||
โ @aws-sdk/querystring-builder โ 10000 โ 380426.03 op/sec โ ยฑ 1.69 % โ | ||
โ http-querystring-stringify โ 10000 โ 489248.93 op/sec โ ยฑ 1.54 % โ | ||
โ URLSearchParams โ 10000 โ 579241.21 op/sec โ ยฑ 1.92 % โ | ||
โ querystringparser โ 1500 โ 667303.72 op/sec โ ยฑ 0.77 % โ | ||
โ querystringify โ 10000 โ 780283.61 op/sec โ ยฑ 2.43 % โ | ||
โ node:querystring โ 10000 โ 1779241.34 op/sec โ ยฑ 6.49 % โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ Fastest test โ Samples โ Result โ Tolerance โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโข | ||
โ fast-querystring โ 10000 โ 2125769.45 op/sec โ ยฑ 3.93 % โ | ||
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโงโโโโโโโโโโงโโโโโโโโโโโโโโโโโโโโงโโโโโโโโโโโโ | ||
``` |
15766
88
11