From d993703e9b52651d456e7eceb691f90228b2cd5e Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Tue, 26 May 2020 05:49:58 -0400 Subject: Add 95th percentile MSPT and replace average MSPT with median MSPT (#55) --- .../me/lucko/spark/common/util/RollingAverage.java | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'spark-common/src/main/java/me/lucko/spark/common/util') diff --git a/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java b/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java index 5cf5bb5..1e5e8b2 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java +++ b/spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java @@ -23,6 +23,8 @@ package me.lucko.spark.common.util; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; import java.util.Queue; public class RollingAverage { @@ -79,4 +81,26 @@ public class RollingAverage { } } + public double getMedian() { + return getPercentile(50); + } + + public double getPercentile(int percentile) { + if (percentile < 0 || percentile > 100) { + throw new IllegalArgumentException("Invalid percentage " + percentile); + } + + List sortedSamples; + synchronized (this) { + if (this.samples.isEmpty()) { + return 0; + } + sortedSamples = new ArrayList<>(this.samples); + } + sortedSamples.sort(null); + + int rank = (int) Math.ceil((percentile / 100d) * sortedSamples.size()); + return sortedSamples.get(rank).doubleValue(); + } + } -- cgit