Instead of having three separate EWMA instances, use a MultiEWMA that updates
all moving-average rates simultaneously using a single event counter. Locking
is not required to update the three rates.
We can remove the lock in StandardMeter with the only change in behaviour that
the (*StandardMeter).Mark function no longer increments StandardMeter.count and
MultiEWMA.uncounted atomically with respect to each other.
This only matters when ticking the meter every 5 seconds, where goroutines that
called Mark before the 5-second tick may appear to have called it after the
tick instead.
The benefit is that we avoid contention on frequently-used meters.
Instead of having three separate EWMA instances, use a MultiEWMA that updates all moving-average rates simultaneously using a single event counter. Locking is not required to update the three rates.
We can remove the lock in StandardMeter with the only change in behaviour that the (*StandardMeter).Mark function no longer increments StandardMeter.count and MultiEWMA.uncounted atomically with respect to each other. This only matters when ticking the meter every 5 seconds, where goroutines that called Mark before the 5-second tick may appear to have called it after the tick instead. The benefit is that we avoid contention on frequently-used meters.