1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 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
- })
- }
- }
|