123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // Copyright 2018 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 xerrors_test
- import (
- "bytes"
- "fmt"
- "math/big"
- "testing"
- "golang.org/x/xerrors"
- "golang.org/x/xerrors/internal"
- )
- type myType struct{}
- func (myType) Format(s fmt.State, v rune) {
- s.Write(bytes.Repeat([]byte("Hi! "), 10))
- }
- func BenchmarkErrorf(b *testing.B) {
- err := xerrors.New("foo")
- // pi := big.NewFloat(3.14) // Something expensive.
- num := big.NewInt(5)
- args := func(a ...interface{}) []interface{} { return a }
- benchCases := []struct {
- name string
- format string
- args []interface{}
- }{
- {"no_format", "msg: %v", args(err)},
- {"with_format", "failed %d times: %v", args(5, err)},
- {"method: mytype", "pi: %v", args("myfile.go", myType{}, err)},
- {"method: number", "pi: %v", args("myfile.go", num, err)},
- }
- for _, bc := range benchCases {
- b.Run(bc.name, func(b *testing.B) {
- b.Run("ExpWithTrace", func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- xerrors.Errorf(bc.format, bc.args...)
- }
- })
- b.Run("ExpNoTrace", func(b *testing.B) {
- internal.EnableTrace = false
- defer func() { internal.EnableTrace = true }()
- for i := 0; i < b.N; i++ {
- xerrors.Errorf(bc.format, bc.args...)
- }
- })
- b.Run("Core", func(b *testing.B) {
- for i := 0; i < b.N; i++ {
- fmt.Errorf(bc.format, bc.args...)
- }
- })
- })
- }
- }
|