(v float64)
| 281 | } |
| 282 | |
| 283 | func (s *Statistics) Record(v float64) { |
| 284 | for { |
| 285 | min := s.min.Load() |
| 286 | if min <= v { |
| 287 | break |
| 288 | } |
| 289 | if s.min.CompareAndSwap(min, v) { |
| 290 | break |
| 291 | } |
| 292 | } |
| 293 | for { |
| 294 | max := s.max.Load() |
| 295 | if max >= v { |
| 296 | break |
| 297 | } |
| 298 | if s.max.CompareAndSwap(max, v) { |
| 299 | break |
| 300 | } |
| 301 | } |
| 302 | for { |
| 303 | avg := s.avg.Load() |
| 304 | count := s.count.Load() |
| 305 | mean := s.mean.Load() |
| 306 | value := s.value.Load() |
| 307 | |
| 308 | delta := v - mean |
| 309 | newCount := count + 1 |
| 310 | newMean := mean + (delta / float64(newCount)) |
| 311 | newValue := value + (delta * (v - newMean)) |
| 312 | newAvg := avg + ((v - avg) / float64(newCount)) |
| 313 | if s.avg.CompareAndSwap(avg, newAvg) && s.count.CompareAndSwap(count, newCount) && s.mean.CompareAndSwap(mean, newMean) && s.value.CompareAndSwap(value, newValue) { |
| 314 | break |
| 315 | } |
| 316 | } |
| 317 | } |
| 318 | |
| 319 | type Counter struct { |
| 320 | total *atomic.Int64 |
no outgoing calls