ewma_test.go 6.9 KB

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