ewma_test.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package metrics
  2. import (
  3. "math"
  4. "testing"
  5. )
  6. func BenchmarkEWMA(b *testing.B) {
  7. a := NewEWMA1()
  8. b.ResetTimer()
  9. for i := 0; i < b.N; i++ {
  10. a.Update(1)
  11. a.Tick()
  12. }
  13. }
  14. func TestEWMA1(t *testing.T) {
  15. a := NewEWMA1()
  16. a.Update(3)
  17. a.Tick()
  18. if rate := a.Rate(); math.Abs(0.6-rate) > epsilon {
  19. t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
  20. }
  21. elapseMinute(a)
  22. if rate := a.Rate(); math.Abs(0.22072766470286553-rate) > epsilon {
  23. t.Errorf("1 minute a.Rate(): 0.22072766470286553 != %v\n", rate)
  24. }
  25. elapseMinute(a)
  26. if rate := a.Rate(); math.Abs(0.08120116994196772-rate) > epsilon {
  27. t.Errorf("2 minute a.Rate(): 0.08120116994196772 != %v\n", rate)
  28. }
  29. elapseMinute(a)
  30. if rate := a.Rate(); math.Abs(0.029872241020718428-rate) > epsilon {
  31. t.Errorf("3 minute a.Rate(): 0.029872241020718428 != %v\n", rate)
  32. }
  33. elapseMinute(a)
  34. if rate := a.Rate(); math.Abs(0.01098938333324054-rate) > epsilon {
  35. t.Errorf("4 minute a.Rate(): 0.01098938333324054 != %v\n", rate)
  36. }
  37. elapseMinute(a)
  38. if rate := a.Rate(); math.Abs(0.004042768199451294-rate) > epsilon {
  39. t.Errorf("5 minute a.Rate(): 0.004042768199451294 != %v\n", rate)
  40. }
  41. elapseMinute(a)
  42. if rate := a.Rate(); math.Abs(0.0014872513059998212-rate) > epsilon {
  43. t.Errorf("6 minute a.Rate(): 0.0014872513059998212 != %v\n", rate)
  44. }
  45. elapseMinute(a)
  46. if rate := a.Rate(); math.Abs(0.0005471291793327122-rate) > epsilon {
  47. t.Errorf("7 minute a.Rate(): 0.0005471291793327122 != %v\n", rate)
  48. }
  49. elapseMinute(a)
  50. if rate := a.Rate(); math.Abs(0.00020127757674150815-rate) > epsilon {
  51. t.Errorf("8 minute a.Rate(): 0.00020127757674150815 != %v\n", rate)
  52. }
  53. elapseMinute(a)
  54. if rate := a.Rate(); math.Abs(7.404588245200814e-05-rate) > epsilon {
  55. t.Errorf("9 minute a.Rate(): 7.404588245200814e-05 != %v\n", rate)
  56. }
  57. elapseMinute(a)
  58. if rate := a.Rate(); math.Abs(2.7239957857491083e-05-rate) > epsilon {
  59. t.Errorf("10 minute a.Rate(): 2.7239957857491083e-05 != %v\n", rate)
  60. }
  61. elapseMinute(a)
  62. if rate := a.Rate(); math.Abs(1.0021020474147462e-05-rate) > epsilon {
  63. t.Errorf("11 minute a.Rate(): 1.0021020474147462e-05 != %v\n", rate)
  64. }
  65. elapseMinute(a)
  66. if rate := a.Rate(); math.Abs(3.6865274119969525e-06-rate) > epsilon {
  67. t.Errorf("12 minute a.Rate(): 3.6865274119969525e-06 != %v\n", rate)
  68. }
  69. elapseMinute(a)
  70. if rate := a.Rate(); math.Abs(1.3561976441886433e-06-rate) > epsilon {
  71. t.Errorf("13 minute a.Rate(): 1.3561976441886433e-06 != %v\n", rate)
  72. }
  73. elapseMinute(a)
  74. if rate := a.Rate(); math.Abs(4.989172314621449e-07-rate) > epsilon {
  75. t.Errorf("14 minute a.Rate(): 4.989172314621449e-07 != %v\n", rate)
  76. }
  77. elapseMinute(a)
  78. if rate := a.Rate(); math.Abs(1.8354139230109722e-07-rate) > epsilon {
  79. t.Errorf("15 minute a.Rate(): 1.8354139230109722e-07 != %v\n", rate)
  80. }
  81. }
  82. func TestEWMA5(t *testing.T) {
  83. a := NewEWMA5()
  84. a.Update(3)
  85. a.Tick()
  86. if rate := a.Rate(); math.Abs(0.6-rate) > epsilon {
  87. t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
  88. }
  89. elapseMinute(a)
  90. if rate := a.Rate(); math.Abs(0.49123845184678905-rate) > epsilon {
  91. t.Errorf("1 minute a.Rate(): 0.49123845184678905 != %v\n", rate)
  92. }
  93. elapseMinute(a)
  94. if rate := a.Rate(); math.Abs(0.4021920276213837-rate) > epsilon {
  95. t.Errorf("2 minute a.Rate(): 0.4021920276213837 != %v\n", rate)
  96. }
  97. elapseMinute(a)
  98. if rate := a.Rate(); math.Abs(0.32928698165641596-rate) > epsilon {
  99. t.Errorf("3 minute a.Rate(): 0.32928698165641596 != %v\n", rate)
  100. }
  101. elapseMinute(a)
  102. if rate := a.Rate(); math.Abs(0.269597378470333-rate) > epsilon {
  103. t.Errorf("4 minute a.Rate(): 0.269597378470333 != %v\n", rate)
  104. }
  105. elapseMinute(a)
  106. if rate := a.Rate(); math.Abs(0.2207276647028654-rate) > epsilon {
  107. t.Errorf("5 minute a.Rate(): 0.2207276647028654 != %v\n", rate)
  108. }
  109. elapseMinute(a)
  110. if rate := a.Rate(); math.Abs(0.18071652714732128-rate) > epsilon {
  111. t.Errorf("6 minute a.Rate(): 0.18071652714732128 != %v\n", rate)
  112. }
  113. elapseMinute(a)
  114. if rate := a.Rate(); math.Abs(0.14795817836496392-rate) > epsilon {
  115. t.Errorf("7 minute a.Rate(): 0.14795817836496392 != %v\n", rate)
  116. }
  117. elapseMinute(a)
  118. if rate := a.Rate(); math.Abs(0.12113791079679326-rate) > epsilon {
  119. t.Errorf("8 minute a.Rate(): 0.12113791079679326 != %v\n", rate)
  120. }
  121. elapseMinute(a)
  122. if rate := a.Rate(); math.Abs(0.09917933293295193-rate) > epsilon {
  123. t.Errorf("9 minute a.Rate(): 0.09917933293295193 != %v\n", rate)
  124. }
  125. elapseMinute(a)
  126. if rate := a.Rate(); math.Abs(0.08120116994196763-rate) > epsilon {
  127. t.Errorf("10 minute a.Rate(): 0.08120116994196763 != %v\n", rate)
  128. }
  129. elapseMinute(a)
  130. if rate := a.Rate(); math.Abs(0.06648189501740036-rate) > epsilon {
  131. t.Errorf("11 minute a.Rate(): 0.06648189501740036 != %v\n", rate)
  132. }
  133. elapseMinute(a)
  134. if rate := a.Rate(); math.Abs(0.05443077197364752-rate) > epsilon {
  135. t.Errorf("12 minute a.Rate(): 0.05443077197364752 != %v\n", rate)
  136. }
  137. elapseMinute(a)
  138. if rate := a.Rate(); math.Abs(0.04456414692860035-rate) > epsilon {
  139. t.Errorf("13 minute a.Rate(): 0.04456414692860035 != %v\n", rate)
  140. }
  141. elapseMinute(a)
  142. if rate := a.Rate(); math.Abs(0.03648603757513079-rate) > epsilon {
  143. t.Errorf("14 minute a.Rate(): 0.03648603757513079 != %v\n", rate)
  144. }
  145. elapseMinute(a)
  146. if rate := a.Rate(); math.Abs(0.0298722410207183831020718428-rate) > epsilon {
  147. t.Errorf("15 minute a.Rate(): 0.0298722410207183831020718428 != %v\n", rate)
  148. }
  149. }
  150. func TestEWMA15(t *testing.T) {
  151. a := NewEWMA15()
  152. a.Update(3)
  153. a.Tick()
  154. if rate := a.Rate(); math.Abs(0.6-rate) > epsilon {
  155. t.Errorf("initial a.Rate(): 0.6 != %v\n", rate)
  156. }
  157. elapseMinute(a)
  158. if rate := a.Rate(); math.Abs(0.5613041910189706-rate) > epsilon {
  159. t.Errorf("1 minute a.Rate(): 0.5613041910189706 != %v\n", rate)
  160. }
  161. elapseMinute(a)
  162. if rate := a.Rate(); math.Abs(0.5251039914257684-rate) > epsilon {
  163. t.Errorf("2 minute a.Rate(): 0.5251039914257684 != %v\n", rate)
  164. }
  165. elapseMinute(a)
  166. if rate := a.Rate(); math.Abs(0.4912384518467888184678905-rate) > epsilon {
  167. t.Errorf("3 minute a.Rate(): 0.4912384518467888184678905 != %v\n", rate)
  168. }
  169. elapseMinute(a)
  170. if rate := a.Rate(); math.Abs(0.459557003018789-rate) > epsilon {
  171. t.Errorf("4 minute a.Rate(): 0.459557003018789 != %v\n", rate)
  172. }
  173. elapseMinute(a)
  174. if rate := a.Rate(); math.Abs(0.4299187863442732-rate) > epsilon {
  175. t.Errorf("5 minute a.Rate(): 0.4299187863442732 != %v\n", rate)
  176. }
  177. elapseMinute(a)
  178. if rate := a.Rate(); math.Abs(0.4021920276213831-rate) > epsilon {
  179. t.Errorf("6 minute a.Rate(): 0.4021920276213831 != %v\n", rate)
  180. }
  181. elapseMinute(a)
  182. if rate := a.Rate(); math.Abs(0.37625345116383313-rate) > epsilon {
  183. t.Errorf("7 minute a.Rate(): 0.37625345116383313 != %v\n", rate)
  184. }
  185. elapseMinute(a)
  186. if rate := a.Rate(); math.Abs(0.3519877317060185-rate) > epsilon {
  187. t.Errorf("8 minute a.Rate(): 0.3519877317060185 != %v\n", rate)
  188. }
  189. elapseMinute(a)
  190. if rate := a.Rate(); math.Abs(0.3292869816564153165641596-rate) > epsilon {
  191. t.Errorf("9 minute a.Rate(): 0.3292869816564153165641596 != %v\n", rate)
  192. }
  193. elapseMinute(a)
  194. if rate := a.Rate(); math.Abs(0.3080502714195546-rate) > epsilon {
  195. t.Errorf("10 minute a.Rate(): 0.3080502714195546 != %v\n", rate)
  196. }
  197. elapseMinute(a)
  198. if rate := a.Rate(); math.Abs(0.2881831806538789-rate) > epsilon {
  199. t.Errorf("11 minute a.Rate(): 0.2881831806538789 != %v\n", rate)
  200. }
  201. elapseMinute(a)
  202. if rate := a.Rate(); math.Abs(0.26959737847033216-rate) > epsilon {
  203. t.Errorf("12 minute a.Rate(): 0.26959737847033216 != %v\n", rate)
  204. }
  205. elapseMinute(a)
  206. if rate := a.Rate(); math.Abs(0.2522102307052083-rate) > epsilon {
  207. t.Errorf("13 minute a.Rate(): 0.2522102307052083 != %v\n", rate)
  208. }
  209. elapseMinute(a)
  210. if rate := a.Rate(); math.Abs(0.23594443252115815-rate) > epsilon {
  211. t.Errorf("14 minute a.Rate(): 0.23594443252115815 != %v\n", rate)
  212. }
  213. elapseMinute(a)
  214. if rate := a.Rate(); math.Abs(0.2207276647028646247028654470286553-rate) > epsilon {
  215. t.Errorf("15 minute a.Rate(): 0.2207276647028646247028654470286553 != %v\n", rate)
  216. }
  217. }
  218. func elapseMinute(a EWMA) {
  219. for i := 0; i < 12; i++ {
  220. a.Tick()
  221. }
  222. }