Skip to content

Conversation

@jasnell
Copy link
Collaborator

@jasnell jasnell commented Oct 23, 2025

Needs careful review. It does improve performance but the impl is a bit more complex. Fiddled around with a number of other perf tweaks but nothing that really moved the needle enough to justify the increased complexity. Not entirely sold on this impl so be brutal in reviews.

@jasnell jasnell requested review from a team as code owners October 23, 2025 01:33
@jasnell jasnell marked this pull request as draft October 23, 2025 01:53
@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch 2 times, most recently from 7f431f6 to b94d316 Compare October 23, 2025 02:30
@codspeed-hq
Copy link

codspeed-hq bot commented Oct 23, 2025

CodSpeed Performance Report

Merging #5396 will improve performances by 45.68%

Comparing jasnell/http-headers-take-2 (30f6df6) with main (153c3ef)

Summary

⚡ 2 improvements
✅ 32 untouched
⏩ 9 skipped1

Benchmarks breakdown

Benchmark BASE HEAD Change
constructor[ApiHeaders] 90.9 ms 62.4 ms +45.68%
set_append[ApiHeaders] 15.9 ms 11.9 ms +33.69%

Footnotes

  1. 9 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch 4 times, most recently from 8191e31 to 7f84859 Compare October 23, 2025 15:09
@jasnell
Copy link
Collaborator Author

jasnell commented Oct 23, 2025

Internal tests are failing because the refactor changes the ordering of the headers in places... will need to see if we can preserve the order but first want to see if this has a positive impact on performance overall... waiting for benchmark results to be updated.

@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch 2 times, most recently from 21b09a3 to b59e107 Compare October 23, 2025 16:13
@jasnell jasnell marked this pull request as ready for review October 23, 2025 16:41
@jasnell
Copy link
Collaborator Author

jasnell commented Oct 23, 2025

Marking as ready for review but there are still some internal test updates I'll need to do on the internal repo.

@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch from 7ac27f1 to 7c52fb0 Compare October 23, 2025 17:02
'headers/headers-errors.any.js': {
comment: 'Our validation of header names is too lax',
expectedFailures: [
'Create headers giving bad header name as init argument',
Copy link
Member

Choose a reason for hiding this comment

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

So we did end up getting a couple of WPT improvements out of it, nice.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yep, but we'll need to make sure this doesn't count as a breaking change that'll need a compat flag.

@danlapid
Copy link
Collaborator

Whenever this is done I want as many reviewers as we can get on this, incl Harris, Kenton, Mike, Yagiz, etc.

@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch from 0a4c8f0 to 7c52fb0 Compare October 23, 2025 19:53
@jasnell jasnell requested a review from mikea October 23, 2025 23:15
@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch 2 times, most recently from 2e794b4 to fb81688 Compare October 24, 2025 23:40
@jasnell
Copy link
Collaborator Author

jasnell commented Oct 24, 2025

Note for reviewers: while it likely is possible to get more performance gain with additional tweaks on this, the emphasis for review should be on correctness and ensuring that the revised implementation does not introduce new bugs, etc. We can tweak additional performance knobs separately in follow up PRs.

Copy link
Member

@kentonv kentonv left a comment

Choose a reason for hiding this comment

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

Only skimmed briefly but I think there's an opportunity for big gains here by taking advantage of the tables that are already available in HttpOverCapnpFactory.

@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch from 38a2fab to 37b85f0 Compare October 28, 2025 00:47
@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch from 37b85f0 to cd7bdc8 Compare October 28, 2025 18:26
@jasnell
Copy link
Collaborator Author

jasnell commented Oct 28, 2025

Further improved the revised implementation and added an additional benchmark.

  • The additional benchmark shows a ~31% performance improvement in a set/append case.
  • The common headers are now indexed and hashed at compile time to shave off additional work
  • jsg::ByteString is removed since it was largely a useless shell anyway. It's warning functionality was wasted on header names since we strictly validate those anyway, and has been replaced to only warn on header values. Given that use of jsg::ByteString was incurring an additional redundant scan on all header names and values this yielded a fairly good performance improvement.
  • Additional improvements are likely possible but this is already quite significant as it is.

@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch from cd7bdc8 to 95b9cbc Compare October 28, 2025 20:36
@danlapid
Copy link
Collaborator

Whenever this is done I want as many reviewers as we can get on this, incl Harris, Kenton, Mike, Yagiz, etc.

Bumping this
@harrishancock @kentonv @mikea @anonrig we need as many eyes as we can get on this, we can't get this change wrong again, important to optimise headers but we need to make sure we are right with our change

In preparation to re-apply Headers performance improvements
Modify the kj::HttpHeaders instead and then construct the
api::Headers from that.
While the common header names and indices are defined in
the capnp header, they are unlikely to change often (if at
all). To avoid the overhead of building the hash map at
runtime and performing the hash lookups, we can hardcode
the common header names in an array and use direct indexing
to retrieve them. Should at least save a handful of CPU
cycles.
The type is largely obsolete and was being used only to
warn about invalid header names/values in Headers.
However, it incurred an additional overhead when
being created. This was especially non-sensical for
header names since we already validate those to be
proper HTTP token strings. Removing the type simplifies
code and helps boost overall performance.
@jasnell jasnell force-pushed the jasnell/http-headers-take-2 branch from 95b9cbc to 30f6df6 Compare October 29, 2025 10:47
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.

5 participants