From: Andy Pan Date: Wed, 24 Aug 2022 15:02:16 +0000 (+0800) Subject: net/http: reduce calls to append in hexEscapeNonASCII to gain a slight performance... X-Git-Tag: go1.21rc1~1445 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5cded8b3bfb9d47a4e76e6ae8f4cfed15bf49666;p=gostls13.git net/http: reduce calls to append in hexEscapeNonASCII to gain a slight performance boost goos: linux goarch: amd64 pkg: net/http cpu: DO-Premium-Intel │ old │ new │ │ sec/op │ sec/op vs base │ HexEscapeNonASCII-4 469.6n ± 20% 371.1n ± 9% -20.98% (p=0.000 n=10) │ old │ new │ │ B/op │ B/op vs base │ HexEscapeNonASCII-4 192.0 ± 0% 192.0 ± 0% ~ (p=1.000 n=10) ¹ ¹ all samples are equal │ old │ new │ │ allocs/op │ allocs/op vs base │ HexEscapeNonASCII-4 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ ¹ all samples are equal Change-Id: Ic8d2b3ddcf2cf724dec3f51a2aba205f2c6e4fe6 Reviewed-on: https://go-review.googlesource.com/c/go/+/425786 Reviewed-by: Than McIntosh Auto-Submit: Ian Lance Taylor Run-TryBot: Andy Pan TryBot-Result: Gopher Robot Reviewed-by: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- diff --git a/src/net/http/http.go b/src/net/http/http.go index 101799f574..9b81654fcc 100644 --- a/src/net/http/http.go +++ b/src/net/http/http.go @@ -86,14 +86,20 @@ func hexEscapeNonASCII(s string) string { return s } b := make([]byte, 0, newLen) + var pos int for i := 0; i < len(s); i++ { if s[i] >= utf8.RuneSelf { + if pos < i { + b = append(b, s[pos:i]...) + } b = append(b, '%') b = strconv.AppendInt(b, int64(s[i]), 16) - } else { - b = append(b, s[i]) + pos = i + 1 } } + if pos < len(s) { + b = append(b, s[pos:]...) + } return string(b) } diff --git a/src/net/http/http_test.go b/src/net/http/http_test.go index 0d92fe5f96..1c9fb33b69 100644 --- a/src/net/http/http_test.go +++ b/src/net/http/http_test.go @@ -218,3 +218,13 @@ func TestNoUnicodeStrings(t *testing.T) { t.Fatal(err) } } + +const redirectURL = "/thisaredirect细雪withasciilettersのけぶabcdefghijk.html" + +func BenchmarkHexEscapeNonASCII(b *testing.B) { + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + hexEscapeNonASCII(redirectURL) + } +}