golang.org/x/exp@v0.0.0-20240506185415-9bf2ced13842/slog/benchmarks/benchmarks.go (about)

     1  // Copyright 2022 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package benchmarks contains benchmarks for slog.
     6  //
     7  // These benchmarks are loosely based on github.com/uber-go/zap/benchmarks.
     8  // They have the following desirable properties:
     9  //
    10  //   - They test a complete log event, from the user's call to its return.
    11  //
    12  //   - The benchmarked code is run concurrently in multiple goroutines, to
    13  //     better simulate a real server (the most common environment for structured
    14  //     logs).
    15  //
    16  //   - Some handlers are optimistic versions of real handlers, doing real-world
    17  //     tasks as fast as possible (and sometimes faster, in that an
    18  //     implementation may not be concurrency-safe). This gives us a lower bound
    19  //     on handler performance, so we can evaluate the (handler-independent) core
    20  //     activity of the package in an end-to-end context without concern that a
    21  //     slow handler implementation is skewing the results.
    22  //
    23  //   - We also test the built-in handlers, for comparison.
    24  //
    25  // As of Go 1.20, fetching the pc for a single nearby frame is slow. We hope to
    26  // improve its speed before this package is released. Run the benchmarks with
    27  //
    28  //	-tags nopc
    29  //
    30  // to remove this cost.
    31  package benchmarks
    32  
    33  import (
    34  	"errors"
    35  	"time"
    36  
    37  	"golang.org/x/exp/slog"
    38  )
    39  
    40  // The symbols in this file are exported so that the Zap benchmarks can use them.
    41  
    42  const TestMessage = "Test logging, but use a somewhat realistic message length."
    43  
    44  var (
    45  	TestTime     = time.Date(2022, time.May, 1, 0, 0, 0, 0, time.UTC)
    46  	TestString   = "7e3b3b2aaeff56a7108fe11e154200dd/7819479873059528190"
    47  	TestInt      = 32768
    48  	TestDuration = 23 * time.Second
    49  	TestError    = errors.New("fail")
    50  )
    51  
    52  var TestAttrs = []slog.Attr{
    53  	slog.String("string", TestString),
    54  	slog.Int("status", TestInt),
    55  	slog.Duration("duration", TestDuration),
    56  	slog.Time("time", TestTime),
    57  	slog.Any("error", TestError),
    58  }
    59  
    60  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"