mirror of
https://github.com/rclone/rclone.git
synced 2024-12-15 22:08:12 +08:00
64 lines
1.0 KiB
Go
64 lines
1.0 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
|
||
|
})
|
||
|
}
|
||
|
}
|