z_all_bench_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. // +build alltests
  2. // +build go1.7
  3. // Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved.
  4. // Use of this source code is governed by a MIT license found in the LICENSE file.
  5. package codec
  6. // see notes in z_all_test.go
  7. import (
  8. "strconv"
  9. "sync"
  10. "testing"
  11. "time"
  12. )
  13. import . "github.com/ugorji/go/codec"
  14. var benchmarkGroupOnce sync.Once
  15. var benchmarkGroupSave struct {
  16. testUseIoEncDec int
  17. testUseReset bool
  18. testDepth int
  19. testMapStringKeyOnly bool
  20. }
  21. func benchmarkGroupInitAll() {
  22. testInitAll() // calls flag.Parse
  23. benchmarkGroupSave.testUseIoEncDec = testUseIoEncDec
  24. benchmarkGroupSave.testUseReset = testUseReset
  25. benchmarkGroupSave.testDepth = testDepth
  26. benchmarkGroupSave.testMapStringKeyOnly = testMapStringKeyOnly
  27. }
  28. func benchmarkGroupReset() {
  29. testUseIoEncDec = benchmarkGroupSave.testUseIoEncDec
  30. testUseReset = benchmarkGroupSave.testUseReset
  31. testDepth = benchmarkGroupSave.testDepth
  32. testMapStringKeyOnly = benchmarkGroupSave.testMapStringKeyOnly
  33. }
  34. func benchmarkOneFn(fns []func(*testing.B)) func(*testing.B) {
  35. switch len(fns) {
  36. case 0:
  37. return nil
  38. case 1:
  39. return fns[0]
  40. default:
  41. return func(t *testing.B) {
  42. for _, f := range fns {
  43. f(t)
  44. }
  45. }
  46. }
  47. }
  48. func benchmarkSuiteNoop(b *testing.B) {
  49. testOnce.Do(testInitAll)
  50. b.ResetTimer()
  51. for i := 0; i < b.N; i++ {
  52. time.Sleep(10 * time.Millisecond)
  53. }
  54. }
  55. func benchmarkSuite(t *testing.B, fns ...func(t *testing.B)) {
  56. benchmarkGroupOnce.Do(benchmarkGroupInitAll)
  57. f := benchmarkOneFn(fns)
  58. // find . -name "*_test.go" | xargs grep -e 'flag.' | cut -d '&' -f 2 | cut -d ',' -f 1 | grep -e '^bench'
  59. testReinit() // so flag.Parse() is called first, and never called again
  60. benchReinit()
  61. testDecodeOptions = DecodeOptions{}
  62. testEncodeOptions = EncodeOptions{}
  63. benchmarkGroupReset()
  64. testReinit()
  65. benchReinit()
  66. t.Run("options-false...", f)
  67. benchmarkGroupReset()
  68. testUseIoEncDec = 1024
  69. testReinit()
  70. benchReinit()
  71. t.Run("use-bufio-!bytes", f)
  72. benchmarkGroupReset()
  73. testUseReset = true
  74. testReinit()
  75. benchReinit()
  76. t.Run("reset-enc-dec...", f)
  77. benchmarkGroupReset()
  78. }
  79. func benchmarkVeryQuickSuite(t *testing.B, name string, fns ...func(t *testing.B)) {
  80. benchmarkDivider()
  81. benchmarkGroupOnce.Do(benchmarkGroupInitAll)
  82. benchmarkGroupReset()
  83. // bd=1 2 | ti=-1, 1024 |
  84. testUseIoEncDec = -1
  85. // testDepth = depth
  86. testReinit()
  87. benchReinit()
  88. t.Run(name+"-bd"+strconv.Itoa(testDepth)+"........", benchmarkOneFn(fns))
  89. benchmarkGroupReset()
  90. }
  91. func benchmarkQuickSuite(t *testing.B, name string, fns ...func(t *testing.B)) {
  92. benchmarkVeryQuickSuite(t, name, fns...)
  93. // encoded size of TestStruc is between 20K and 30K for bd=1 // consider buffer=1024 * 16 * testDepth
  94. testUseIoEncDec = 1024 // (value of defEncByteBufSize): use smaller buffer, and more flushes - it's ok.
  95. // testDepth = depth
  96. testReinit()
  97. benchReinit()
  98. t.Run(name+"-bd"+strconv.Itoa(testDepth)+"-buf"+strconv.Itoa(testUseIoEncDec), benchmarkOneFn(fns))
  99. testUseIoEncDec = 0
  100. // testDepth = depth
  101. testReinit()
  102. benchReinit()
  103. t.Run(name+"-bd"+strconv.Itoa(testDepth)+"-io.....", benchmarkOneFn(fns))
  104. benchmarkGroupReset()
  105. }
  106. /*
  107. z='bench_test.go'
  108. find . -name "$z" | xargs grep -e '^func Benchmark.*Encode' | \
  109. cut -d '(' -f 1 | cut -d ' ' -f 2 | \
  110. while read f; do echo "t.Run(\"$f\", $f)"; done &&
  111. echo &&
  112. find . -name "$z" | xargs grep -e '^func Benchmark.*Decode' | \
  113. cut -d '(' -f 1 | cut -d ' ' -f 2 | \
  114. while read f; do echo "t.Run(\"$f\", $f)"; done
  115. */
  116. func benchmarkCodecGroup(t *testing.B) {
  117. benchmarkDivider()
  118. t.Run("Benchmark__Msgpack____Encode", Benchmark__Msgpack____Encode)
  119. t.Run("Benchmark__Binc_______Encode", Benchmark__Binc_______Encode)
  120. t.Run("Benchmark__Simple_____Encode", Benchmark__Simple_____Encode)
  121. t.Run("Benchmark__Cbor_______Encode", Benchmark__Cbor_______Encode)
  122. t.Run("Benchmark__Json_______Encode", Benchmark__Json_______Encode)
  123. benchmarkDivider()
  124. t.Run("Benchmark__Msgpack____Decode", Benchmark__Msgpack____Decode)
  125. t.Run("Benchmark__Binc_______Decode", Benchmark__Binc_______Decode)
  126. t.Run("Benchmark__Simple_____Decode", Benchmark__Simple_____Decode)
  127. t.Run("Benchmark__Cbor_______Decode", Benchmark__Cbor_______Decode)
  128. t.Run("Benchmark__Json_______Decode", Benchmark__Json_______Decode)
  129. }
  130. func BenchmarkCodecSuite(t *testing.B) { benchmarkSuite(t, benchmarkCodecGroup) }
  131. func benchmarkJsonEncodeGroup(t *testing.B) {
  132. t.Run("Benchmark__Json_______Encode", Benchmark__Json_______Encode)
  133. }
  134. func benchmarkJsonDecodeGroup(t *testing.B) {
  135. t.Run("Benchmark__Json_______Decode", Benchmark__Json_______Decode)
  136. }
  137. func benchmarkCborEncodeGroup(t *testing.B) {
  138. t.Run("Benchmark__Cbor_______Encode", Benchmark__Cbor_______Encode)
  139. }
  140. func benchmarkCborDecodeGroup(t *testing.B) {
  141. t.Run("Benchmark__Cbor_______Decode", Benchmark__Cbor_______Decode)
  142. }
  143. func BenchmarkCodecQuickSuite(t *testing.B) {
  144. benchmarkQuickSuite(t, "cbor", benchmarkCborEncodeGroup)
  145. benchmarkQuickSuite(t, "cbor", benchmarkCborDecodeGroup)
  146. benchmarkQuickSuite(t, "json", benchmarkJsonEncodeGroup)
  147. benchmarkQuickSuite(t, "json", benchmarkJsonDecodeGroup)
  148. // depths := [...]int{1, 4}
  149. // for _, d := range depths {
  150. // benchmarkQuickSuite(t, d, benchmarkJsonEncodeGroup)
  151. // benchmarkQuickSuite(t, d, benchmarkJsonDecodeGroup)
  152. // }
  153. // benchmarkQuickSuite(t, 1, benchmarkJsonEncodeGroup)
  154. // benchmarkQuickSuite(t, 4, benchmarkJsonEncodeGroup)
  155. // benchmarkQuickSuite(t, 1, benchmarkJsonDecodeGroup)
  156. // benchmarkQuickSuite(t, 4, benchmarkJsonDecodeGroup)
  157. // benchmarkQuickSuite(t, 1, benchmarkJsonEncodeGroup, benchmarkJsonDecodeGroup)
  158. // benchmarkQuickSuite(t, 4, benchmarkJsonEncodeGroup, benchmarkJsonDecodeGroup)
  159. // benchmarkQuickSuite(t, benchmarkJsonEncodeGroup)
  160. // benchmarkQuickSuite(t, benchmarkJsonDecodeGroup)
  161. }