diff --git a/src/net/url/url.go b/src/net/url/url.go index a69754880149a9..e96542d2b60540 100644 --- a/src/net/url/url.go +++ b/src/net/url/url.go @@ -15,7 +15,6 @@ package url import ( "errors" "fmt" - "maps" "net/netip" "path" "slices" @@ -1048,7 +1047,14 @@ func (v Values) Encode() string { return "" } var buf strings.Builder - for _, k := range slices.Sorted(maps.Keys(v)) { + // To minimize allocations, instead of using slices.Sorted(maps.Keys(v)), + // we pre-size the slice in which we collect v's keys and then sort it. + keys := make([]string, 0, len(v)) + for k := range v { + keys = append(keys, k) + } + slices.Sort(keys) + for _, k := range keys { vs := v[k] keyEscaped := QueryEscape(k) for _, v := range vs { diff --git a/src/net/url/url_test.go b/src/net/url/url_test.go index a7543d6fd40b1e..6a076fb4532fd6 100644 --- a/src/net/url/url_test.go +++ b/src/net/url/url_test.go @@ -1101,6 +1101,15 @@ func TestEncodeQuery(t *testing.T) { } } +func BenchmarkEncodeQuery(b *testing.B) { + b.ReportAllocs() + for b.Loop() { + for _, tt := range encodeQueryTests { + tt.m.Encode() + } + } +} + var resolvePathTests = []struct { base, ref, expected string }{