You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
`SlidingTimeWindowMovingAverages` `sumBuckets()` method could be optimized to perform indexed list access and remove allocations as it currently allocates a `LongAdder` as well as one or two streams. If one is using the 1, 5, or 15 minute rates on hot paths, these can be unnecessary expensive allocations as well as less optimized computations.
We can avoid the allocations completely and accumulate the sum directly to a `long` via optimized direct indexed list access.
[MovingAverageBenchmarks](https://github.com/palantir/tritium/blob/davids/OptimizedSlidingTimeWindowMovingAverages/tritium-jmh/src/jmh/java/com/palantir/tritium/microbenchmarks/MovingAverageBenchmarks.java) demonstrates the difference in implementations in both execution time (22x faster) and allocations:
```
Benchmark (recordings) (type) Mode Cnt Score Error Units
MovingAverageBenchmarks.getM1Rate 10 SlidingTimeWindowMovingAverages avgt 20 1364.969 ± 12.040 ns/op
MovingAverageBenchmarks.getM1Rate:gc.alloc.rate.norm 10 SlidingTimeWindowMovingAverages avgt 20 688.037 ± 0.001 B/op
MovingAverageBenchmarks.getM1Rate 10 OptimizedSlidingTimeWindowMovingAverages avgt 20 59.182 ± 0.343 ns/op
MovingAverageBenchmarks.getM1Rate:gc.alloc.rate.norm 10 OptimizedSlidingTimeWindowMovingAverages avgt 20 0.002 ± 0.001 B/op
MovingAverageBenchmarks.getM1Rate 1000 SlidingTimeWindowMovingAverages avgt 20 1401.864 ± 107.134 ns/op
MovingAverageBenchmarks.getM1Rate:gc.alloc.rate.norm 1000 SlidingTimeWindowMovingAverages avgt 20 688.038 ± 0.003 B/op
MovingAverageBenchmarks.getM1Rate 1000 OptimizedSlidingTimeWindowMovingAverages avgt 20 61.157 ± 1.393 ns/op
MovingAverageBenchmarks.getM1Rate:gc.alloc.rate.norm 1000 OptimizedSlidingTimeWindowMovingAverages avgt 20 0.002 ± 0.001 B/op
```
0 commit comments