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>
This commit is contained in:
Kevin Burke 2024-03-21 15:59:30 -07:00 committed by Gopher Robot
parent 25aa45afcf
commit 13a1f39ade
2 changed files with 32 additions and 2 deletions

View File

@ -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.

View File

@ -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
}