Skip to content

perf: return relaxed header values to the fast scanner - #882

Merged
ShogunPanda merged 1 commit into
mainfrom
fix/881-relaxed-header-fast-path
Oct 1, 2026
Merged

ShogunPanda merged 1 commit into
mainfrom
fix/881-relaxed-header-fast-path

Conversation

@mcollina

Copy link
Copy Markdown
Member

Fixes #881.

The relaxed header-value matcher previously stayed in its own loop, duplicating the ordinary header scanner (including vectorized blocks) in the generated state machine. After accepting a relaxed byte, return to the ordinary header_value scanner. Keep invalid bytes on an error path and cover consecutive relaxed bytes and a bare CR following one.

Local -O3 standalone benchmarks (4 and 32 headers) improved with clang; gcc remains layout-sensitive. For example, one pinned-core 32-header interleaved run measured ~1,470–1,590 ns/request before and ~1,290–1,350 ns/request after with clang. These numbers are machine/compiler dependent.

Validation: npm test (276 passing), npm run lint, npx tsc --noEmit -p tsconfig.json, git diff --check.

@mcollina

Copy link
Copy Markdown
Member Author

@pimterry PTAL

@pimterry pimterry left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, good find.

@ShogunPanda
ShogunPanda merged commit 1ce164b into main Oct 1, 2026
10 checks passed
@ShogunPanda
ShogunPanda deleted the fix/881-relaxed-header-fast-path branch October 1, 2026 10:59
rosamarmin pushed a commit to artgins/yunetas that referenced this pull request Nov 13, 2026
… goes back to the fast scanner

No security fix. A verbatim drop-in over pristine 9.4.3: api.c and http.c
byte-identical, llhttp.h only its version, llhttp.c the generated state
machine of nodejs/llhttp#882 (a header value, after a byte only the lenient
mode accepts, returns to the ordinary vectorized scanner). ghttp_parser.c
turns lenient headers on, so every yuno that parses HTTP runs it.
THIRD-PARTY-NOTICES and LICENSE-llhttp.txt name 9.4.4; same license.

Clean SDK rebuild and full suite: 465/465 (with the test fixes of the next
commit; the first run was 464/465, test_c_udp_tx_refused, see there).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013ZKGyx7NpGKnUHixaFcNzG
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Parsing is 8-12% slower with clang (and layout-sensitive with gcc) since 9.4.1

3 participants