diff options
author | Kevin Burke <kevin@burke.dev> | 2024-03-21 15:59:30 -0700 |
---|---|---|
committer | Gopher Robot <gobot@golang.org> | 2024-03-25 18:23:25 +0000 |
commit | 13a1f39ade1fe90124b2ea5b7e28c4bcb34041ca (patch) | |
tree | e5aa71c220ad4f0d5347dbfb30bf472017b439ad /src/log | |
parent | 25aa45afcf40ff6c699b47bad0cb609bba84da12 (diff) | |
download | go-13a1f39ade1fe90124b2ea5b7e28c4bcb34041ca.tar.gz go-13a1f39ade1fe90124b2ea5b7e28c4bcb34041ca.zip |
log/slog: use plain string concatenation for Attr.String
Plain string concatenation with the plus operator for Attr.String is
much faster than invoking fmt.Sprintf. Added a benchmark to verify
this (just running on my Mac with stuff in the background but should
be sufficient to demonstrate the effect).
name old time/op new time/op delta
AttrString-8 1.24µs ± 3% 0.43µs ± 0% -65.17% (p=0.000 n=20+17)
name old alloc/op new alloc/op delta
AttrString-8 432B ± 0% 152B ± 0% ~ (p=1.000 n=1+1)
name old allocs/op new allocs/op delta
AttrString-8 30.0 ± 0% 16.0 ± 0% ~ (p=1.000 n=1+1)
Change-Id: I18ac91cbff1047d168b51a595601e36b5f676615
Reviewed-on: https://go-review.googlesource.com/c/go/+/573517
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Emmanuel Odeke <emmanuel@orijtech.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Emmanuel Odeke <emmanuel@orijtech.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/log')
-rw-r--r-- | src/log/slog/attr.go | 3 | ||||
-rw-r--r-- | src/log/slog/attr_test.go | 31 |
2 files changed, 32 insertions, 2 deletions
diff --git a/src/log/slog/attr.go b/src/log/slog/attr.go index 2f459467cb..067c537cc9 100644 --- a/src/log/slog/attr.go +++ b/src/log/slog/attr.go @@ -5,7 +5,6 @@ package slog import ( - "fmt" "time" ) @@ -92,7 +91,7 @@ func (a Attr) Equal(b Attr) bool { } func (a Attr) String() string { - return fmt.Sprintf("%s=%s", a.Key, a.Value) + return a.Key + "=" + a.Value.String() } // isEmpty reports whether a has an empty key and a nil value. diff --git a/src/log/slog/attr_test.go b/src/log/slog/attr_test.go index 1187a856fd..e01447cfed 100644 --- a/src/log/slog/attr_test.go +++ b/src/log/slog/attr_test.go @@ -41,3 +41,34 @@ func TestAttrNoAlloc(t *testing.T) { _ = s _ = x } + +func BenchmarkAttrString(b *testing.B) { + var ( + is string + u string + f string + bn string + s string + x string + ds string + p = &is + d time.Duration + ) + b.ReportAllocs() + for i := 0; i < b.N; i++ { + is = Int64("key", 1).String() + u = Uint64("key", 1).String() + f = Float64("key", 1).String() + bn = Bool("key", true).String() + s = String("key", "foo").String() + ds = Duration("key", d).String() + x = Any("key", p).String() + } + _ = u + _ = f + _ = bn + _ = s + _ = x + _ = ds + _ = p +} |