bench_test.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package fserr
  2. import (
  3. "fmt"
  4. "testing"
  5. )
  6. // 针对于 New、Wrap 两种构建错误的方式进行性能测试对比,结果如下(堆栈深度为10、100、1000):
  7. // New
  8. // fserr
  9. // 3029 ns/op
  10. // 3788 ns/op
  11. // 14480 ns/op
  12. //
  13. // pkgerr
  14. // 2982 ns/op
  15. // 4434 ns/op
  16. // 15177 ns/op
  17. //
  18. //
  19. // Wrap
  20. // fserr
  21. // 41.08 ns/op
  22. // 483.5 ns/op
  23. // 4722 ns/op
  24. //
  25. // pkgerr
  26. // 38.52 ns/op
  27. // 585.9 ns/op
  28. // 5148 ns/op
  29. //
  30. // WithCode性能如下:
  31. // 4657 ns/op
  32. // 5143 ns/op
  33. // 14912 ns/op
  34. func yesErrors(at, depth int, how func() error) error {
  35. if at >= depth {
  36. return how()
  37. }
  38. return yesErrors(at+1, depth, how)
  39. }
  40. // GlobalE is an exported global to store the result of benchmark results,
  41. // preventing the compiler from optimising the benchmark functions away.
  42. var GlobalE interface{}
  43. func BenchmarkWithCode(b *testing.B) {
  44. NewOK(ErrDb, "success")
  45. for _, r := range []int{
  46. 10,
  47. 100,
  48. 1000,
  49. } {
  50. name := fmt.Sprintf("fserr-stack-%d", r)
  51. b.Run(name, func(b *testing.B) {
  52. var err error
  53. b.ReportAllocs()
  54. for i := 0; i < b.N; i++ {
  55. err = yesErrors(0, r, func() error {
  56. return WithCode(nil, ErrDb)
  57. })
  58. }
  59. b.StopTimer()
  60. GlobalE = err
  61. })
  62. }
  63. }