From a81c8b3bf2697b86ac7d3d29d7c0fb71c0716a84 Mon Sep 17 00:00:00 2001 From: Koya IWAMURA Date: Wed, 24 Apr 2024 01:16:08 +0900 Subject: net/url: improve URL.String performance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit URL.String performs memory allocation many times, but it can improve performance by allocating memory that it clearly knows it needs. This CL achieves 24.6% speedup, 18.3% memory reduction, and 46.7% fewer memory allocations on existing benchmarks. │ string_old.txt │ string_new2.txt │ │ sec/op │ sec/op vs base │ String-16 3.622µ ± 5% 2.730µ ± 2% -24.63% (p=0.000 n=10) │ string_old.txt │ string_new2.txt │ │ B/op │ B/op vs base │ String-16 1.406Ki ± 0% 1.148Ki ± 0% -18.33% (p=0.000 n=10) │ string_old.txt │ string_new2.txt │ │ allocs/op │ allocs/op vs base │ String-16 60.00 ± 0% 32.00 ± 0% -46.67% (p=0.000 n=10) Change-Id: I70199be952eddc44134945077e52740e8921088f Reviewed-on: https://go-review.googlesource.com/c/go/+/581155 Reviewed-by: Ian Lance Taylor LUCI-TryBot-Result: Go LUCI Auto-Submit: Ian Lance Taylor Reviewed-by: Emmanuel Odeke Reviewed-by: Joedian Reid --- src/net/url/url.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/net/url/url.go b/src/net/url/url.go index f362958edd..7cd6913ad7 100644 --- a/src/net/url/url.go +++ b/src/net/url/url.go @@ -814,6 +814,22 @@ func validOptionalPort(port string) bool { // - if u.Fragment is empty, #fragment is omitted. func (u *URL) String() string { var buf strings.Builder + + n := len(u.Scheme) + if u.Opaque != "" { + n += len(u.Opaque) + } else { + if !u.OmitHost && (u.Scheme != "" || u.Host != "" || u.User != nil) { + username := u.User.Username() + password, _ := u.User.Password() + n += len(username) + len(password) + len(u.Host) + } + n += len(u.Path) + } + n += len(u.RawQuery) + len(u.RawFragment) + n += len(":" + "//" + "//" + ":" + "@" + "/" + "./" + "?" + "#") + buf.Grow(n) + if u.Scheme != "" { buf.WriteString(u.Scheme) buf.WriteByte(':') -- cgit v1.2.3-54-g00ecf