package fserr import ( "fmt" "testing" ) // 针对于 New、Wrap 两种构建错误的方式进行性能测试对比,结果如下(堆栈深度为10、100、1000): // New // fserr // 3029 ns/op // 3788 ns/op // 14480 ns/op // // pkgerr // 2982 ns/op // 4434 ns/op // 15177 ns/op // // // Wrap // fserr // 41.08 ns/op // 483.5 ns/op // 4722 ns/op // // pkgerr // 38.52 ns/op // 585.9 ns/op // 5148 ns/op // // WithCode性能如下: // 4657 ns/op // 5143 ns/op // 14912 ns/op func yesErrors(at, depth int, how func() error) error { if at >= depth { return how() } return yesErrors(at+1, depth, how) } // GlobalE is an exported global to store the result of benchmark results, // preventing the compiler from optimising the benchmark functions away. var GlobalE interface{} func BenchmarkWithCode(b *testing.B) { NewOK(ErrDb, "success") for _, r := range []int{ 10, 100, 1000, } { name := fmt.Sprintf("fserr-stack-%d", r) b.Run(name, func(b *testing.B) { var err error b.ReportAllocs() for i := 0; i < b.N; i++ { err = yesErrors(0, r, func() error { return WithCode(nil, ErrDb) }) } b.StopTimer() GlobalE = err }) } }