aboutsummaryrefslogtreecommitdiff
path: root/spark-common/src/main/java/me/lucko/spark/common/util
diff options
context:
space:
mode:
authorAndrew Steinborn <andrew@steinborn.me>2020-05-26 05:49:58 -0400
committerGitHub <noreply@github.com>2020-05-26 10:49:58 +0100
commitd993703e9b52651d456e7eceb691f90228b2cd5e (patch)
tree3f3c3450cb69818c1ea7edec552e92a44884a4b3 /spark-common/src/main/java/me/lucko/spark/common/util
parent0f207b3c44c701d42ac1bb828f5c967e2de73568 (diff)
downloadspark-d993703e9b52651d456e7eceb691f90228b2cd5e.tar.gz
spark-d993703e9b52651d456e7eceb691f90228b2cd5e.tar.bz2
spark-d993703e9b52651d456e7eceb691f90228b2cd5e.zip
Add 95th percentile MSPT and replace average MSPT with median MSPT (#55)
Diffstat (limited to 'spark-common/src/main/java/me/lucko/spark/common/util')
-rw-r--r--spark-common/src/main/java/me/lucko/spark/common/util/RollingAverage.java24
1 files changed, 24 insertions, 0 deletions
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<BigDecimal> 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();
+ }
+
}