From: Kevin Burke Date: Thu, 21 Mar 2024 22:59:30 +0000 (-0700) Subject: log/slog: use plain string concatenation for Attr.String X-Git-Tag: go1.23rc1~782 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=13a1f39ade1fe90124b2ea5b7e28c4bcb34041ca;p=gostls13.git 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 Reviewed-by: Jonathan Amsterdam Run-TryBot: Emmanuel Odeke LUCI-TryBot-Result: Go LUCI Auto-Submit: Emmanuel Odeke Reviewed-by: Cherry Mui Reviewed-by: Emmanuel Odeke TryBot-Result: Gopher Robot --- 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 +}