60 lines
906 B
Go
60 lines
906 B
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)
|
||
|
}
|
||
|
|
||
|
func BenchmarkErrors(b *testing.B) {
|
||
|
var toperr error
|
||
|
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()
|
||
|
toperr = err
|
||
|
})
|
||
|
}
|
||
|
}
|