ewma_test.go 6.9 KB

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