Skip to content

caddyhttp: presize buffers in hot paths to reduce allocations#7842

Open
jvoisin wants to merge 1 commit into
caddyserver:masterfrom
jvoisin:prealloc
Open

caddyhttp: presize buffers in hot paths to reduce allocations#7842
jvoisin wants to merge 1 commit into
caddyserver:masterfrom
jvoisin:prealloc

Conversation

@jvoisin

@jvoisin jvoisin commented Jun 24, 2026

Copy link
Copy Markdown

Right-size three per-request allocations that previously grew from a nil/empty backing array, causing repeated reallocation:

  • CleanPath: pre-Grow the strings.Builder used when slash collapsing is disabled, instead of letting it reallocate as runes are appended
  • headers: presize the rewritten value slice in HeaderOps.ApplyTo's Set loop instead of appending from nil
  • reverseproxy: presize the weights slice in WeightedRoundRobinSelection .Select

This commit also adds benchmarks exercising each path. Measured with benchstat with count=20 and GOMAXPROCS=1, with p=0.000:

                                sec/op                  B/op              allocs/op

CleanPathNoCollapse 1013.4n -> 828.6n (-18.23%) 120->64 (-46.67%) 4->1 (-75.00%)
HeaderOpsApplyToSet 1262.0n -> 955.8n (-24.27%) 255->152 (-40.39%) 9->6 (-33.33%)
WeightedRoundRobinSelect 215.8n -> 200.3n ( -7.20%) 112->96 (-14.29%) 2->2 (N/A)

Assistance Disclosure

I wrote the code, but Copilot generated the tests.

Right-size three per-request allocations that previously grew from a
nil/empty backing array, causing repeated reallocation:

- CleanPath: pre-Grow the strings.Builder used when slash collapsing is
  disabled, instead of letting it reallocate as runes are appended
- headers: presize the rewritten value slice in HeaderOps.ApplyTo's Set
  loop instead of appending from nil
- reverseproxy: presize the weights slice in WeightedRoundRobinSelection
  .Select

This commit also adds benchmarks exercising each path. Measured with benchstat
with count=20 and GOMAXPROCS=1, with p=0.000:

                                    sec/op                  B/op              allocs/op
CleanPathNoCollapse       1013.4n -> 828.6n  (-18.23%)  120->64  (-46.67%)   4->1  (-75.00%)
HeaderOpsApplyToSet       1262.0n -> 955.8n  (-24.27%)  255->152 (-40.39%)   9->6  (-33.33%)
WeightedRoundRobinSelect   215.8n -> 200.3n  ( -7.20%)  112->96  (-14.29%)   2->2  (N/A)
@CLAassistant

CLAassistant commented Jun 24, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

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.

2 participants