| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
|
Review requested:
|
Sorry, something went wrong.
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #65363 +/- ##
==========================================
- Coverage 90.31% 90.11% -0.20%
==========================================
Files 751 752 +1
Lines 249956 251862 +1906
Branches 47204 47356 +152
==========================================
+ Hits 225745 226969 +1224
- Misses 15612 16235 +623
- Partials 8599 8658 +59
... and 90 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Sorry, something went wrong.
There was a problem hiding this comment.
AI agents are not permitted to use Signed-off-by
Sorry, something went wrong.
|
Removed the Signed-off-by trailer from the commit(s). An AI agent cannot attest the DCO. |
Sorry, something went wrong.
Parse query strings with indexOf instead of a per-character state machine, skip ToString when values are already strings, cache toString() until the list mutates, and join serialized pairs. Signed-off-by: Yagiz Nizipli <yagiz@nizipli.com> Assisted-by: Cursor
Leave lone '%' and non-hex percent sequences intact so serialization matches the previous parser, and use native indexOf/slice/push on the query-string hot path. Signed-off-by: Yagiz Nizipli <yagiz@nizipli.com> Assisted-by: Cursor
| } | ||
| const out = []; | ||
| // Native indexOf/slice/push outperform primordials on this tight loop. | ||
| const encoded = qs.indexOf('+', i) !== -1 || qs.indexOf('%', i) !== -1; |
There was a problem hiding this comment.
nit:
| const encoded = qs.indexOf('+', i) !== -1 || qs.indexOf('%', i) !== -1; | |
| const hasPlus = qs.indexOf('+', i) !== -1; | |
| const hasPercent = qs.indexOf('%', i) !== -1; | |
| const encoded = hasPlus || hasPercent; |
Sorry, something went wrong.
| } | ||
|
|
||
| { |
There was a problem hiding this comment.
We can add edge case for fast path change
?, &&&, a=%2F%20b, a=%E2%82%AC, a=%c3%28
| } | |
| { | |
| } | |
| { | |
| const params = new URLSearchParams('?'); | |
| assert.deepStrictEqual([...params], []); | |
| assert.strictEqual(params.toString(), ''); | |
| } | |
| { | |
| const params = new URLSearchParams('&&&'); | |
| assert.deepStrictEqual([...params], []); | |
| assert.strictEqual(params.toString(), ''); | |
| } | |
| { | |
| const params = new URLSearchParams('a=%2F%20b'); | |
| assert.strictEqual(params.get('a'), '/ b'); | |
| assert.strictEqual(params.toString(), 'a=%2F+b'); | |
| } | |
| { | |
| const params = new URLSearchParams('a=%E2%82%AC'); | |
| assert.strictEqual(params.get('a'), '€'); | |
| assert.strictEqual(params.toString(), 'a=%E2%82%AC'); | |
| } | |
| { | |
| const params = new URLSearchParams('a=%c3%28'); | |
| assert.strictEqual(params.get('a'), '%c3%28'); | |
| assert.strictEqual(params.toString(), 'a=%25c3%2528'); | |
| } | |
| { |
Sorry, something went wrong.
There was a problem hiding this comment.
lgtm
Sorry, something went wrong.
Sorry, something went wrong.
There was a problem hiding this comment.
Lgtm
Sorry, something went wrong.
There was a problem hiding this comment.
ه
Sorry, something went wrong.
Commit Queue failed- Loading data for nodejs/node/pull/65363 ✔ Done loading data for nodejs/node/pull/65363 ----------------------------------- PR info ------------------------------------ Title url: speed up URLSearchParams (#65363) ⚠ Could not retrieve the email or name of the PR author's from user's GitHub profile! Branch anonrig:cursor/url-searchparams-performance-603e -> nodejs:main Labels whatwg-url, needs-ci, commit-queue, commit-queue-squash Commits 2 - url: speed up URLSearchParams - url: only percent-decode complete %HH sequences Committers 1 - Yagiz Nizipli <yagiz@nizipli.com> PR-URL: https://github.com/nodejs/node/pull/65363 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day> Reviewed-By: Aviv Keller <me@aviv.sh> ------------------------------ Generated metadata ------------------------------ PR-URL: https://github.com/nodejs/node/pull/65363 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day> Reviewed-By: Aviv Keller <me@aviv.sh> -------------------------------------------------------------------------------- ℹ This PR was created on Tue, 18 Aug 2026 01:38:00 GMT ✔ Approvals: 3 ✔ - Matteo Collina (@mcollina) (TSC): https://github.com/nodejs/node/pull/65363#pullrequestreview-4988761883 ✔ - Gürgün Dayıoğlu (@gurgunday): https://github.com/nodejs/node/pull/65363#pullrequestreview-4996082466 ✔ - Aviv Keller (@avivkeller): https://github.com/nodejs/node/pull/65363#pullrequestreview-4996124171 ✘ GitHub CI is still running ℹ Last Full PR CI on 2026-08-21T15:26:43Z: https://ci.nodejs.org/job/node-test-pull-request/76158/ - Querying data for job/node-test-pull-request/76158/ ✔ Build data downloaded ✘ Last Jenkins CI still running -------------------------------------------------------------------------------- ✔ Aborted `git node land` session in /home/runner/work/node/node/.ncuhttps://github.com/nodejs/node/actions/runs/32519106371 |
Sorry, something went wrong.
Sorry, something went wrong.
Parse query strings with indexOf instead of a per-character state machine, skip ToString when values are already strings, cache toString() until the list mutates, and join serialized pairs. Signed-off-by: Yagiz Nizipli <yagiz@nizipli.com> Assisted-by: Cursor PR-URL: #65363 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day> Reviewed-By: Aviv Keller <me@aviv.sh>
Parse query strings with indexOf instead of a per-character state machine, skip ToString when values are already strings, cache toString() until the list mutates, and join serialized pairs. Signed-off-by: Yagiz Nizipli <yagiz@nizipli.com> Assisted-by: Cursor PR-URL: #65363 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Gürgün Dayıoğlu <hey@gurgun.day> Reviewed-By: Aviv Keller <me@aviv.sh>
| Back | FazBrowse Home | New Git URL |
This speeds up WHATWG URLSearchParams without changing observable behavior.
Independent of the new URL() parse PR (#65361).
What changed
Tests
Local benches
Same binary family, both run with --no-node-snapshot (new JS is not in the V8 snapshot). Rates in ops/s:
The large toString() jump is the serialization cache: the common “build params, stringify many times / read URL.href” path no longer re-encodes an unchanged list.
Ada already has a C url_search_params API. This keeps the implementation in JS to avoid a JS/C++ call on every get/append.
Assisted-by: Cursor