Add TPSWatcher #62
@ -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<Double> meter = new LinkedList<>();
|
||||
|
||||
private int count = 30;
|
||||
|
||||
private LinkedList<Double> 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();
|
||||
}
|
||||
|
||||
}
|
||||
Lixfel
hat
Wann wird now < 0? Wann wird now < 0?
|
||||
|
||||
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<Double> 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();
|
||||
Lixfel
hat
Das hier, nur das hier einfach alle 1s bzw. alle 10s ausführen, und du hast deine DurchschnittsTPS für die letzte 1s/10s. Das hier, nur das hier einfach alle 1s bzw. alle 10s ausführen, und du hast deine DurchschnittsTPS für die letzte 1s/10s.
YoyoNow
hat
Kann ich es einfach jede Sekunde machen, und dann 10 werte merken für 10 Sekunden? Das ganze könnte ich in einem fixen array speichern und auswerten Kann ich es einfach jede Sekunde machen, und dann 10 werte merken für 10 Sekunden? Das ganze könnte ich in einem fixen array speichern und auswerten
|
||||
|
||||
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);
|
||||
Lixfel
hat
30s erscheint mir unnötig. 30s erscheint mir unnötig.
YoyoNow
hat
Ok dann werde ich diesen Wert rausstreichen Ok dann werde ich diesen Wert rausstreichen
|
||||
|
||||
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);
|
||||
Lixfel
hat
Ich würde gerne mit dieser Methode wenn dann ALLE verfügbaren TPS-Werte bekommen wollen, auch die von Spigot gemessenen. Ich würde gerne mit dieser Methode wenn dann ALLE verfügbaren TPS-Werte bekommen wollen, auch die von Spigot gemessenen.
YoyoNow
hat
Ok also willst du das dann als array oder liste? Ok also willst du das dann als array oder liste?
|
||||
}
|
||||
|
||||
}
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
Da wir weder die statistische Abweichung messen noch die Werte irgendwo hier speichern, ist meiner Meinung nach jegliche Liste hier verkehrt. Es reicht, wenn sich der 10s-Durchschnitt alle 10s aktualisiert und der 1s-Durchschnitt sich sekündlich aktualisiert, da muss nicht jeder Tick da sein => Keine Listen nötig. Ich möchte eine Implementierung ohne jegliche Listen.
Warum können wir nicht auch die 10s immer passend die letzten 10 Sekunden anzeigt und nicht nach 10 Sekunden dann mal wieder die letzten 10 Sekunden, dass finde ich auch nicht so sinnvoll. Ich überlege mal ob ich das anders machen kann
Weil wir dann 10 Werte cachen müssen. Deshalb. Ist wesentlich aufwändiger und aufwändiger zu warten für einen wesentlich geringeren Vorteil