|
@@ -0,0 +1,59 @@
|
|
|
|
|
+// +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
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+}
|