blob: 498bda6c191635ef8671e4545ea7f7023a4eab46 [file] [log] [blame]
// 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"