63 lines
1 KiB
Go
63 lines
1 KiB
Go
// +build go1.7
|
|
|
|
package errors
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
stderrors "errors"
|
|
)
|
|
|
|
func noErrors(at, depth int) error {
|
|
if at >= depth {
|
|
return stderrors.New("no error")
|
|
}
|
|
return noErrors(at+1, depth)
|
|
}
|
|
|
|
func yesErrors(at, depth int) error {
|
|
if at >= depth {
|
|
return New("ye error")
|
|
}
|
|
return yesErrors(at+1, depth)
|
|
}
|
|
|
|
// GlobalE is an exported global to store the result of benchmark results,
|
|
// preventing the compiler from optimising the benchmark functions away.
|
|
var GlobalE error
|
|
|
|
func BenchmarkErrors(b *testing.B) {
|
|
type run struct {
|
|
stack int
|
|
std bool
|
|
}
|
|
runs := []run{
|
|
{10, false},
|
|
{10, true},
|
|
{100, false},
|
|
{100, true},
|
|
{1000, false},
|
|
{1000, true},
|
|
}
|
|
for _, r := range runs {
|
|
part := "pkg/errors"
|
|
if r.std {
|
|
part = "errors"
|
|
}
|
|
name := fmt.Sprintf("%s-stack-%d", part, r.stack)
|
|
b.Run(name, func(b *testing.B) {
|
|
var err error
|
|
f := yesErrors
|
|
if r.std {
|
|
f = noErrors
|
|
}
|
|
b.ReportAllocs()
|
|
for i := 0; i < b.N; i++ {
|
|
err = f(0, r.stack)
|
|
}
|
|
b.StopTimer()
|
|
GlobalE = err
|
|
})
|
|
}
|
|
}
|