From 3959e3c8b867a4c132ca9e3d17a4b011a895d932 Mon Sep 17 00:00:00 2001 From: jojo Date: Sun, 27 Sep 2020 17:27:00 +0200 Subject: [PATCH] Optimize TPSWatcher --- .../src/de/steamwar/core/TPSWatcher.java | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/core/TPSWatcher.java b/SpigotCore_Main/src/de/steamwar/core/TPSWatcher.java index 75f33eb..7e75119 100644 --- a/SpigotCore_Main/src/de/steamwar/core/TPSWatcher.java +++ b/SpigotCore_Main/src/de/steamwar/core/TPSWatcher.java @@ -21,36 +21,38 @@ package de.steamwar.core; import org.bukkit.Bukkit; +import java.util.Iterator; import java.util.LinkedList; public class TPSWatcher { - private static class TPSMeter { + private LinkedList meter = new LinkedList<>(); + private int count = 30; - private LinkedList meter = new LinkedList<>(); - private int count; + private double sum = 0; + private int sumCount = 0; - public TPSMeter(int count) { - this.count = count; - } - - public void add(double tps) { - meter.addLast(tps); + private void add(double tps) { + sum += tps; + sumCount++; + if (sumCount > 20) { + meter.addLast(sum); if (meter.size() > count) meter.removeFirst(); + sum = 0; + sumCount = 0; } - - public double get() { - double total = 0; - for (double d : meter) total += d; - return total / meter.size(); - } - } - private double now = 20.0; - private TPSMeter one_minute = new TPSMeter(1200); - private TPSMeter five_minutes = new TPSMeter(6000); - private TPSMeter ten_minutes = new TPSMeter(12000); + private double average(int count) { + count = Math.min(count, meter.size()); + if (count == 0) return 20.0; + Iterator doubleIterator = meter.iterator(); + double total = 0; + for (int i = 0; i < count; i++) { + total += doubleIterator.next(); + } + return total / count; + } private long lastTime = System.currentTimeMillis(); @@ -62,31 +64,29 @@ public class TPSWatcher { long tickTime = System.currentTimeMillis() - lastTime; lastTime = System.currentTimeMillis(); + double now = 0; if (tickTime != 0) { now = (tickTimeDefault / tickTime) * tickDefault; - } else { - now = 0; } - one_minute.add(now); - five_minutes.add(now); - ten_minutes.add(now); + add(now); }, 1, 1); } - public double getTPS() { - return now; + public enum TpsAverage { + LAST_SECOND(1), + LAST_TEN_SECONDS(10), + LAST_THIRTY_SECONDS(30); + + private int count; + + TpsAverage(int count) { + this.count = count; + } + } - public double get1TPS() { - return one_minute.get(); - } - - public double get5TPS() { - return five_minutes.get(); - } - - public double get10TPS() { - return ten_minutes.get(); + public double getTPS(TpsAverage average) { + return average(average.count); } }