Skip to content

encode: reduce allocations in AcceptedEncodings#7847

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

encode: reduce allocations in AcceptedEncodings#7847
jvoisin wants to merge 1 commit into
caddyserver:masterfrom
jvoisin:enc

Conversation

@jvoisin

@jvoisin jvoisin commented Jun 29, 2026

Copy link
Copy Markdown

AcceptedEncodings runs for every request when response compression is enabled, so its allocations contribute directly to per-request garbage and GC pressure. While the gains are modest, this cuts allocations by two-thirds and bytes nearly in half on a hot path that executes on every compressed request. Fewer allocations means less work for the garbage collector, which at high request rates translates into lower GC frequency and steadier tail latency, not just faster execution of this one function in isolation.

For each token in the Accept-Encoding header it called strings.Split(accepted, ";"), allocating a throwaway slice per encoding, and grew the prefs slice from empty. This commit replaces the per-token Split with strings.Cut (zero allocation) and presize prefs from the comma count.

As requested per the policy, this commit adds a benchmark to exercise the change. With header "gzip, deflate, br;q=0.9, zstd;q=0.8":

AcceptedEncodings

  • sec/op 1158.5n -> 771.8n (-33.38%)
  • B/op 408 -> 216 (-47.06%)
  • allocs/op 9 -> 3 (-66.67%)

Assistance Disclosure

"No AI was used."

AcceptedEncodings runs for every request when response compression is enabled,
so its allocations contribute directly to per-request garbage and GC pressure.
While the gains are modest, this cuts allocations by two-thirds and bytes
nearly in half on a hot path that executes on every compressed request. Fewer
allocations means less work for the garbage collector, which at high request
rates translates into lower GC frequency and steadier tail latency, not just
faster execution of this one function in isolation.

For each token in the Accept-Encoding header it called strings.Split(accepted,
";"), allocating a throwaway slice per encoding, and grew the prefs slice from
empty. This commit replaces the per-token Split with strings.Cut (zero
allocation) and presize prefs from the comma count.

As requested per the policy, this commit adds a benchmark to exercise the
change. With header "gzip, deflate, br;q=0.9, zstd;q=0.8":

AcceptedEncodings
- sec/op  1158.5n -> 771.8n  (-33.38%)
- B/op 408 -> 216  (-47.06%)
- allocs/op 9 -> 3  (-66.67%)
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.

1 participant