Skip to content

Commit

Permalink
net/url: improve URL.String performance
Browse files Browse the repository at this point in the history
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 <iant@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
Reviewed-by: Joedian Reid <joedian@google.com>
  • Loading branch information
cia-rana authored and gopherbot committed Apr 29, 2024
1 parent 99ee616 commit a81c8b3
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/net/url/url.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(':')
Expand Down

0 comments on commit a81c8b3

Please sign in to comment.