whatcanGOwrong

This commit is contained in:
2024-09-19 21:38:24 -04:00
commit d0ae4d841d
17908 changed files with 4096831 additions and 0 deletions
@@ -0,0 +1,25 @@
# Run and compare benchmarks.
# This requires a version of benchstat that supports
# the -ignore flag. The flag was added on or before 13 January 2023,
# so a compatible version can be obtained by running
# go install golang.org/x/perf/cmd/benchstat@latest
count = 10
default: compare-zap compare-zerolog
compare-%: %_benchmarks/out.bench slog.bench
benchstat -ignore pkg $^
slog.bench: *.go ../*.go ../../go.mod
go test -run NONE -bench . -count $(count) > $@
slog-nopc.bench: *.go ../*.go ../../go.mod
go test -tags nopc -run NONE -bench . -count $(count) > $@
%_benchmarks/out.bench: %_benchmarks/*.go %_benchmarks/go.mod
go test -C $*_benchmarks -bench . -count $(count) > $@
# Don't delete the out.bench files after a comparison.
.PRECIOUS: %_benchmarks/out.bench
@@ -0,0 +1,60 @@
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package benchmarks contains benchmarks for slog.
//
// These benchmarks are loosely based on github.com/uber-go/zap/benchmarks.
// They have the following desirable properties:
//
// - They test a complete log event, from the user's call to its return.
//
// - The benchmarked code is run concurrently in multiple goroutines, to
// better simulate a real server (the most common environment for structured
// logs).
//
// - Some handlers are optimistic versions of real handlers, doing real-world
// tasks as fast as possible (and sometimes faster, in that an
// implementation may not be concurrency-safe). This gives us a lower bound
// on handler performance, so we can evaluate the (handler-independent) core
// activity of the package in an end-to-end context without concern that a
// slow handler implementation is skewing the results.
//
// - We also test the built-in handlers, for comparison.
//
// As of Go 1.20, fetching the pc for a single nearby frame is slow. We hope to
// improve its speed before this package is released. Run the benchmarks with
//
// -tags nopc
//
// to remove this cost.
package benchmarks
import (
"errors"
"time"
"golang.org/x/exp/slog"
)
// The symbols in this file are exported so that the Zap benchmarks can use them.
const TestMessage = "Test logging, but use a somewhat realistic message length."
var (
TestTime = time.Date(2022, time.May, 1, 0, 0, 0, 0, time.UTC)
TestString = "7e3b3b2aaeff56a7108fe11e154200dd/7819479873059528190"
TestInt = 32768
TestDuration = 23 * time.Second
TestError = errors.New("fail")
)
var TestAttrs = []slog.Attr{
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
}
const WantText = "time=1651363200 level=0 msg=Test logging, but use a somewhat realistic message length. string=7e3b3b2aaeff56a7108fe11e154200dd/7819479873059528190 status=32768 duration=23000000000 time=1651363200 error=fail\n"
@@ -0,0 +1,141 @@
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package benchmarks
import (
"context"
"io"
"testing"
"golang.org/x/exp/slog"
)
// We pass Attrs (or zap.Fields) inline because it affects allocations: building
// up a list outside of the benchmarked code and passing it in with "..."
// reduces measured allocations.
func BenchmarkAttrs(b *testing.B) {
ctx := context.Background()
for _, handler := range []struct {
name string
h slog.Handler
}{
{"disabled", disabledHandler{}},
{"async discard", newAsyncHandler()},
{"fastText discard", newFastTextHandler(io.Discard)},
{"Text discard", slog.NewTextHandler(io.Discard)},
{"JSON discard", slog.NewJSONHandler(io.Discard)},
} {
logger := slog.New(handler.h)
b.Run(handler.name, func(b *testing.B) {
for _, call := range []struct {
name string
f func()
}{
{
// The number should match nAttrsInline in slog/record.go.
// This should exercise the code path where no allocations
// happen in Record or Attr. If there are allocations, they
// should only be from Duration.String and Time.String.
"5 args",
func() {
logger.LogAttrs(nil, slog.LevelInfo, TestMessage,
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
)
},
},
{
"5 args ctx",
func() {
logger.LogAttrs(ctx, slog.LevelInfo, TestMessage,
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
)
},
},
{
"10 args",
func() {
logger.LogAttrs(nil, slog.LevelInfo, TestMessage,
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
)
},
},
{
"40 args",
func() {
logger.LogAttrs(nil, slog.LevelInfo, TestMessage,
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
slog.String("string", TestString),
slog.Int("status", TestInt),
slog.Duration("duration", TestDuration),
slog.Time("time", TestTime),
slog.Any("error", TestError),
)
},
},
} {
b.Run(call.name, func(b *testing.B) {
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
call.f()
}
})
})
}
})
}
}
@@ -0,0 +1,146 @@
// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package benchmarks
// Handlers for benchmarking.
import (
"context"
"fmt"
"io"
"strconv"
"time"
"golang.org/x/exp/slog"
"golang.org/x/exp/slog/internal/buffer"
)
// A fastTextHandler writes a Record to an io.Writer in a format similar to
// slog.TextHandler, but without quoting or locking. It has a few other
// performance-motivated shortcuts, like writing times as seconds since the
// epoch instead of strings.
//
// It is intended to represent a high-performance Handler that synchronously
// writes text (as opposed to binary).
type fastTextHandler struct {
w io.Writer
}
func newFastTextHandler(w io.Writer) slog.Handler {
return &fastTextHandler{w: w}
}
func (h *fastTextHandler) Enabled(context.Context, slog.Level) bool { return true }
func (h *fastTextHandler) Handle(_ context.Context, r slog.Record) error {
buf := buffer.New()
defer buf.Free()
if !r.Time.IsZero() {
buf.WriteString("time=")
h.appendTime(buf, r.Time)
buf.WriteByte(' ')
}
buf.WriteString("level=")
*buf = strconv.AppendInt(*buf, int64(r.Level), 10)
buf.WriteByte(' ')
buf.WriteString("msg=")
buf.WriteString(r.Message)
r.Attrs(func(a slog.Attr) {
buf.WriteByte(' ')
buf.WriteString(a.Key)
buf.WriteByte('=')
h.appendValue(buf, a.Value)
})
buf.WriteByte('\n')
_, err := h.w.Write(*buf)
return err
}
func (h *fastTextHandler) appendValue(buf *buffer.Buffer, v slog.Value) {
switch v.Kind() {
case slog.KindString:
buf.WriteString(v.String())
case slog.KindInt64:
*buf = strconv.AppendInt(*buf, v.Int64(), 10)
case slog.KindUint64:
*buf = strconv.AppendUint(*buf, v.Uint64(), 10)
case slog.KindFloat64:
*buf = strconv.AppendFloat(*buf, v.Float64(), 'g', -1, 64)
case slog.KindBool:
*buf = strconv.AppendBool(*buf, v.Bool())
case slog.KindDuration:
*buf = strconv.AppendInt(*buf, v.Duration().Nanoseconds(), 10)
case slog.KindTime:
h.appendTime(buf, v.Time())
case slog.KindAny:
a := v.Any()
switch a := a.(type) {
case error:
buf.WriteString(a.Error())
default:
buf.WriteString(fmt.Sprint(a))
}
default:
panic(fmt.Sprintf("bad kind: %s", v.Kind()))
}
}
func (h *fastTextHandler) appendTime(buf *buffer.Buffer, t time.Time) {
*buf = strconv.AppendInt(*buf, t.Unix(), 10)
}
func (h *fastTextHandler) WithAttrs([]slog.Attr) slog.Handler {
panic("fastTextHandler: With unimplemented")
}
func (*fastTextHandler) WithGroup(string) slog.Handler {
panic("fastTextHandler: WithGroup unimplemented")
}
// An asyncHandler simulates a Handler that passes Records to a
// background goroutine for processing.
// Because sending to a channel can be expensive due to locking,
// we simulate a lock-free queue by adding the Record to a ring buffer.
// Omitting the locking makes this little more than a copy of the Record,
// but that is a worthwhile thing to measure because Records are on the large
// side.
type asyncHandler struct {
ringBuffer [100]slog.Record
next int
}
func newAsyncHandler() *asyncHandler {
return &asyncHandler{}
}
func (*asyncHandler) Enabled(context.Context, slog.Level) bool { return true }
func (h *asyncHandler) Handle(_ context.Context, r slog.Record) error {
h.ringBuffer[h.next] = r.Clone()
h.next = (h.next + 1) % len(h.ringBuffer)
return nil
}
func (*asyncHandler) WithAttrs([]slog.Attr) slog.Handler {
panic("asyncHandler: With unimplemented")
}
func (*asyncHandler) WithGroup(string) slog.Handler {
panic("asyncHandler: WithGroup unimplemented")
}
type disabledHandler struct{}
func (disabledHandler) Enabled(context.Context, slog.Level) bool { return false }
func (disabledHandler) Handle(context.Context, slog.Record) error { panic("should not be called") }
func (disabledHandler) WithAttrs([]slog.Attr) slog.Handler {
panic("disabledHandler: With unimplemented")
}
func (disabledHandler) WithGroup(string) slog.Handler {
panic("disabledHandler: WithGroup unimplemented")
}
@@ -0,0 +1,41 @@
package benchmarks
import (
"bytes"
"testing"
"golang.org/x/exp/slices"
"golang.org/x/exp/slog"
)
func TestHandlers(t *testing.T) {
r := slog.NewRecord(TestTime, slog.LevelInfo, TestMessage, 0)
r.AddAttrs(TestAttrs...)
t.Run("text", func(t *testing.T) {
var b bytes.Buffer
h := newFastTextHandler(&b)
if err := h.Handle(nil, r); err != nil {
t.Fatal(err)
}
got := b.String()
if got != WantText {
t.Errorf("\ngot %q\nwant %q", got, WantText)
}
})
t.Run("async", func(t *testing.T) {
h := newAsyncHandler()
if err := h.Handle(nil, r); err != nil {
t.Fatal(err)
}
got := h.ringBuffer[0]
if !got.Time.Equal(r.Time) || !slices.EqualFunc(attrSlice(got), attrSlice(r), slog.Attr.Equal) {
t.Errorf("got %+v, want %+v", got, r)
}
})
}
func attrSlice(r slog.Record) []slog.Attr {
var as []slog.Attr
r.Attrs(func(a slog.Attr) { as = append(as, a) })
return as
}
@@ -0,0 +1,106 @@
goos: linux
goarch: amd64
pkg: golang.org/x/exp/slog/benchmarks
cpu: Intel(R) Xeon(R) CPU @ 2.20GHz
BenchmarkAttrs/disabled/5_args-8 100000000 10.36 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 10.40 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 10.79 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 10.78 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 113187081 10.79 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 95979213 11.13 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 100000000 10.91 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 100000000 11.17 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 100000000 11.05 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 100000000 10.67 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 64571424 19.12 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 62505003 18.98 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 65596965 18.71 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 61716511 18.53 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 62806261 18.80 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 17923170 65.24 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 18474331 67.22 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 17646770 67.86 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 17033931 66.41 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 18256833 66.13 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 14399127 88.84 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 12632341 95.60 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 14252593 84.72 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 11236347 97.45 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 11726569 90.01 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 13305091 91.62 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 12172405 94.63 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 12980976 92.37 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 12803614 104.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 12005320 88.81 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/10_args-8 4059170 319.5 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 3483382 372.3 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 3842409 301.9 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 3839804 335.7 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 3182643 361.1 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 1000000 1060 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 1235323 1161 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 1000000 1206 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 1000000 1254 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 909853 1201 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 6260964 197.8 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 6688066 221.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 7639705 164.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 5220344 200.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 6531496 186.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 7588935 160.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 7122673 178.8 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 6209121 200.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 6370140 173.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 6048418 192.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 2218376 563.1 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 2191339 557.0 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 2051697 607.6 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1971550 595.0 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 2056645 645.7 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 360135 2892 ns/op 1411 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 411124 2846 ns/op 1411 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 480218 2460 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 504228 2464 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 476949 2475 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1291322 862.5 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1418359 856.0 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1339944 946.0 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1348107 857.1 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1320080 910.6 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1277317 861.4 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1341210 981.7 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1268680 907.5 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1302778 969.4 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1276990 940.9 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 791600 1811 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 750620 1718 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 699880 1665 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 924051 1636 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 873486 1525 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 252258 6022 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 238166 5411 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 226570 5721 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 225001 5362 ns/op 1476 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 240476 5466 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1495221 741.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1561606 683.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1548652 802.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1592420 696.6 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1759450 689.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1594424 674.8 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1788061 667.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1541530 706.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1569404 738.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1819743 702.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 1000000 1256 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 1000000 1341 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 960759 1318 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 1000000 1214 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 1000000 1305 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 291825 4156 ns/op 1411 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 287223 4258 ns/op 1411 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 273271 4720 ns/op 1411 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 241485 4373 ns/op 1411 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 333234 4382 ns/op 1411 B/op 1 allocs/op
PASS
ok golang.org/x/exp/slog/benchmarks 148.487s
@@ -0,0 +1,206 @@
goos: linux
goarch: amd64
pkg: golang.org/x/exp/slog/benchmarks
cpu: Intel(R) Xeon(R) CPU @ 2.20GHz
BenchmarkAttrs/disabled/5_args-8 87726345 11.53 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 12.41 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 105380964 10.95 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 11.09 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 11.08 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 109361474 10.98 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 11.08 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 97419044 10.96 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 11.05 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args-8 100000000 11.01 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 69400743 17.91 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 62466876 18.89 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 61274703 18.37 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 63662512 19.00 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 63269335 18.40 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 65971545 18.91 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 62653164 18.29 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 61501500 17.95 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 63020546 18.51 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/5_args_ctx-8 60816229 19.09 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 58447599 19.92 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 59103002 19.97 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 59058175 20.24 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 59801014 19.92 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 59346874 19.98 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 55444516 20.22 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 59346399 20.23 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 56470292 20.02 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 57221503 19.97 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/10_args-8 54583336 20.24 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 16806272 70.63 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 16756441 71.14 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 16822804 72.16 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 16433698 71.04 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 16843483 70.45 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 17040812 70.89 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 16873478 71.21 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 16667295 70.42 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 16593979 78.32 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/disabled/40_args-8 14147412 77.79 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3810328 308.3 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3864543 309.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3881245 311.6 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3840583 307.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3899516 306.8 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3890083 319.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3817888 322.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3816842 314.6 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3572856 314.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args-8 3699051 306.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3599636 336.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3327789 327.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3764053 320.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3667870 326.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3751074 322.6 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3618402 326.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3756518 322.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3728480 323.6 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3721392 322.8 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/5_args_ctx-8 3764152 319.8 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/async_discard/10_args-8 2084524 574.3 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 2300154 565.0 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 2165674 557.9 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 2124346 608.0 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 1974321 567.2 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 2019566 527.7 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 2103444 591.8 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 1887854 646.5 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 1950650 610.0 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/10_args-8 1983426 592.0 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 553869 2140 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 499414 2269 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 534874 2222 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 553262 2121 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 548557 2068 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 537718 2077 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 561046 2081 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 554010 2093 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 547024 2123 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/async_discard/40_args-8 596251 2382 ns/op 1408 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 2790256 409.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 3009939 392.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 2982199 388.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 3077679 411.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 3147536 384.5 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 3083035 406.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 2873736 393.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 3152352 381.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 3154658 403.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args-8 3087505 385.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 2982118 426.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 2847314 396.9 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 2994334 407.8 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 3096763 389.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 2910908 394.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 3070110 411.3 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 2873941 409.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 2901960 414.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 3026241 402.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/5_args_ctx-8 2981787 405.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1592515 731.3 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1701238 727.6 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1512008 740.5 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1570792 715.3 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1678142 782.5 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1500272 804.4 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1436685 748.8 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1538223 766.5 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1562414 727.1 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/10_args-8 1746742 739.6 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 409638 2979 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 381800 2940 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 367718 3067 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 422248 2948 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 403758 3015 ns/op 1413 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 412140 2974 ns/op 1413 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 408601 3200 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 381240 2951 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 388334 3007 ns/op 1413 B/op 1 allocs/op
BenchmarkAttrs/fastText_discard/40_args-8 399074 2901 ns/op 1413 B/op 1 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1282058 971.7 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1211372 950.1 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1000000 1045 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1230904 996.9 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1278661 962.6 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1000000 1027 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1200620 993.5 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1250619 942.1 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1289546 933.7 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args-8 1249658 952.7 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1241697 962.7 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1242026 941.4 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1242705 964.8 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1249431 940.6 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1208154 1020 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1283144 937.9 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1224484 930.6 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1243726 960.3 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 1000000 1024 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/5_args_ctx-8 981321 1037 ns/op 8 B/op 2 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 686640 1655 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 789316 1571 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 763826 1668 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 816855 1505 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 774973 1572 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 736404 1892 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 836869 1512 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 846553 1475 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 823282 1534 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/10_args-8 831930 1608 ns/op 224 B/op 5 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 262455 5024 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 238699 5193 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 224610 5261 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 235082 5272 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 243098 5396 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 255624 5363 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 215061 5232 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 236866 4980 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 234951 5331 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/Text_discard/40_args-8 237111 5029 ns/op 1477 B/op 17 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1482212 778.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1547962 774.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1677744 761.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1506229 830.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1421970 835.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1456422 803.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1525104 820.2 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1576022 779.6 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1537720 760.0 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args-8 1419771 870.3 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1435820 773.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1547727 794.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1499551 750.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1550808 800.7 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1476103 801.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1615399 765.6 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1453222 794.1 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1498340 863.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1504358 788.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/5_args_ctx-8 1516674 814.4 ns/op 0 B/op 0 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 914118 1327 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 984048 1338 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 1000000 1321 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 987379 1272 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 1000000 1343 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 1000000 1272 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 865246 1276 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 784126 1285 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 953875 1258 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/10_args-8 990472 1532 ns/op 208 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 291584 4539 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 273050 4628 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 275667 4160 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 261201 4058 ns/op 1411 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 253822 4428 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 252219 4742 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 288744 4469 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 256788 4236 ns/op 1412 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 296882 4089 ns/op 1411 B/op 1 allocs/op
BenchmarkAttrs/JSON_discard/40_args-8 278248 4504 ns/op 1412 B/op 1 allocs/op
PASS
ok golang.org/x/exp/slog/benchmarks 304.732s