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