aboutsummaryrefslogtreecommitdiff
path: root/src/log
diff options
context:
space:
mode:
authorKevin Burke <kevin@burke.dev>2024-03-21 15:59:30 -0700
committerGopher Robot <gobot@golang.org>2024-03-25 18:23:25 +0000
commit13a1f39ade1fe90124b2ea5b7e28c4bcb34041ca (patch)
treee5aa71c220ad4f0d5347dbfb30bf472017b439ad /src/log
parent25aa45afcf40ff6c699b47bad0cb609bba84da12 (diff)
downloadgo-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.go3
-rw-r--r--src/log/slog/attr_test.go31
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
+}