Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 11, 01:00 UTC
caddyhttp: presize buffers in hot paths to reduce allocations (#7842)
* caddyhttp: presize buffers in hot paths to reduce allocations 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) * caddyhttp: presize strings.Builder in query rewrite and path matcher Two builders whose output size is bounded by a known input length were growing from empty, causing repeated reallocation. Seed each with a capacity hint: - rewrite.buildQueryString: pre-Grow to len(qs) (runs per request when rewrite query manipulation is configured) - MatchPath.matchPatternWithEscapeSequence: pre-Grow to len(escapedPath) (reached only when a path pattern contains % escape sequences) Adds a benchmark for buildQueryString, measured with benchstat: BuildQueryString: - sec/op 965.2n -> 743.3n (-22.99%) - B/op 248->80 (-67.74%) - allocs/op 5->1 (-80.00%) The builder previously reallocated four times per call. The matcher path is cold and not separately benchmarked. * chore: add benchmark headers --------- Signed-off-by: Julien Voisin <jvoisin@users.noreply.github.com>