mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-19 19:25:48 +00:00
Added new flags for timings (#3246)
Co-authored-by: JustAHuman-xD <65748158+JustAHuman-xD@users.noreply.github.com> Co-authored-by: qwertyuioplkjhgfd <qwertyuioplkjhgfd@users.noreply.github.com> Co-authored-by: TheBusyBiscuit <TheBusyBiscuit@users.noreply.github.com> Co-authored-by: J3fftw <44972470+J3fftw1@users.noreply.github.com> Co-authored-by: Jeffrey <jeffrey@kosse.me>
This commit is contained in:
parent
16313ef8a2
commit
8bcf0735e5
@ -15,6 +15,7 @@ import org.bukkit.entity.Player;
|
|||||||
import io.github.thebusybiscuit.slimefun4.core.commands.SlimefunCommand;
|
import io.github.thebusybiscuit.slimefun4.core.commands.SlimefunCommand;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.commands.SubCommand;
|
import io.github.thebusybiscuit.slimefun4.core.commands.SubCommand;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.services.profiler.PerformanceInspector;
|
import io.github.thebusybiscuit.slimefun4.core.services.profiler.PerformanceInspector;
|
||||||
|
import io.github.thebusybiscuit.slimefun4.core.services.profiler.SummaryOrderType;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.services.profiler.inspectors.ConsolePerformanceInspector;
|
import io.github.thebusybiscuit.slimefun4.core.services.profiler.inspectors.ConsolePerformanceInspector;
|
||||||
import io.github.thebusybiscuit.slimefun4.core.services.profiler.inspectors.PlayerPerformanceInspector;
|
import io.github.thebusybiscuit.slimefun4.core.services.profiler.inspectors.PlayerPerformanceInspector;
|
||||||
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
||||||
@ -22,7 +23,7 @@ import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
|||||||
class TimingsCommand extends SubCommand {
|
class TimingsCommand extends SubCommand {
|
||||||
|
|
||||||
private static final String FLAG_PREFIX = "--";
|
private static final String FLAG_PREFIX = "--";
|
||||||
private final Set<String> flags = new HashSet<>(Arrays.asList("verbose"));
|
private final Set<String> flags = new HashSet<>(Arrays.asList("verbose", "avg", "low"));
|
||||||
|
|
||||||
@ParametersAreNonnullByDefault
|
@ParametersAreNonnullByDefault
|
||||||
TimingsCommand(Slimefun plugin, SlimefunCommand cmd) {
|
TimingsCommand(Slimefun plugin, SlimefunCommand cmd) {
|
||||||
@ -30,31 +31,40 @@ class TimingsCommand extends SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getDescription() {
|
protected @Nonnull String getDescription() {
|
||||||
return "commands.timings.description";
|
return "commands.timings.description";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onExecute(CommandSender sender, String[] args) {
|
public void onExecute(CommandSender sender, @Nonnull String[] args) {
|
||||||
if (sender.hasPermission("slimefun.command.timings") || sender instanceof ConsoleCommandSender) {
|
if (!sender.hasPermission("slimefun.command.timings") && !(sender instanceof ConsoleCommandSender)) {
|
||||||
if (hasInvalidFlags(sender, args)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean verbose = hasFlag(args, "verbose");
|
|
||||||
|
|
||||||
if (verbose && sender instanceof Player) {
|
|
||||||
Slimefun.getLocalization().sendMessage(sender, "commands.timings.verbose-player", true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Slimefun.getLocalization().sendMessage(sender, "commands.timings.please-wait", true);
|
|
||||||
|
|
||||||
PerformanceInspector inspector = inspectorOf(sender, verbose);
|
|
||||||
Slimefun.getProfiler().requestSummary(inspector);
|
|
||||||
} else {
|
|
||||||
Slimefun.getLocalization().sendMessage(sender, "messages.no-permission", true);
|
Slimefun.getLocalization().sendMessage(sender, "messages.no-permission", true);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasInvalidFlags(sender, args)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean verbose = hasFlag(args, "verbose");
|
||||||
|
|
||||||
|
if (verbose && sender instanceof Player) {
|
||||||
|
Slimefun.getLocalization().sendMessage(sender, "commands.timings.verbose-player", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SummaryOrderType orderType = SummaryOrderType.HIGHEST;
|
||||||
|
|
||||||
|
if (hasFlag(args, "avg")) {
|
||||||
|
orderType = SummaryOrderType.AVERAGE;
|
||||||
|
} else if (hasFlag(args, "low")) {
|
||||||
|
orderType = SummaryOrderType.LOWEST;
|
||||||
|
}
|
||||||
|
|
||||||
|
Slimefun.getLocalization().sendMessage(sender, "commands.timings.please-wait", true);
|
||||||
|
|
||||||
|
PerformanceInspector inspector = inspectorOf(sender, verbose, orderType);
|
||||||
|
Slimefun.getProfiler().requestSummary(inspector);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParametersAreNonnullByDefault
|
@ParametersAreNonnullByDefault
|
||||||
@ -87,12 +97,12 @@ class TimingsCommand extends SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private PerformanceInspector inspectorOf(@Nonnull CommandSender sender, boolean verbose) {
|
@ParametersAreNonnullByDefault
|
||||||
|
private PerformanceInspector inspectorOf(CommandSender sender, boolean verbose, SummaryOrderType orderType) {
|
||||||
if (sender instanceof Player player) {
|
if (sender instanceof Player player) {
|
||||||
return new PlayerPerformanceInspector(player);
|
return new PlayerPerformanceInspector(player, orderType);
|
||||||
} else {
|
} else {
|
||||||
return new ConsolePerformanceInspector(sender, verbose);
|
return new ConsolePerformanceInspector(sender, verbose, orderType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,4 +38,10 @@ public interface PerformanceInspector {
|
|||||||
*/
|
*/
|
||||||
boolean isVerbose();
|
boolean isVerbose();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The order type for the summary of timings.
|
||||||
|
*
|
||||||
|
* @return The order type for the summary of timings.
|
||||||
|
*/
|
||||||
|
@Nonnull SummaryOrderType getOrderType();
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.core.services.profiler;
|
package io.github.thebusybiscuit.slimefun4.core.services.profiler;
|
||||||
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.ParametersAreNonnullByDefault;
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
@ -64,13 +62,18 @@ class PerformanceSummary {
|
|||||||
summarizeTimings(totalTickedBlocks, "block", sender, items, entry -> {
|
summarizeTimings(totalTickedBlocks, "block", sender, items, entry -> {
|
||||||
int count = profiler.getBlocksOfId(entry.getKey());
|
int count = profiler.getBlocksOfId(entry.getKey());
|
||||||
String time = NumberUtils.getAsMillis(entry.getValue());
|
String time = NumberUtils.getAsMillis(entry.getValue());
|
||||||
|
String message = entry.getKey() + " - " + count + "x (%s)";
|
||||||
|
|
||||||
if (count > 1) {
|
if (count <= 1) {
|
||||||
String average = NumberUtils.getAsMillis(entry.getValue() / count);
|
return String.format(message, time);
|
||||||
|
}
|
||||||
|
|
||||||
return entry.getKey() + " - " + count + "x (" + time + " | avg: " + average + ')';
|
String average = NumberUtils.getAsMillis(entry.getValue() / count);
|
||||||
|
|
||||||
|
if (sender.getOrderType() == SummaryOrderType.AVERAGE) {
|
||||||
|
return String.format(message, average + " | total: " + time);
|
||||||
} else {
|
} else {
|
||||||
return entry.getKey() + " - " + count + "x (" + time + ')';
|
return String.format(message, time + " | avg: " + average);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -91,8 +94,8 @@ class PerformanceSummary {
|
|||||||
|
|
||||||
@ParametersAreNonnullByDefault
|
@ParametersAreNonnullByDefault
|
||||||
private void summarizeTimings(int count, String name, PerformanceInspector inspector, Map<String, Long> map, Function<Map.Entry<String, Long>, String> formatter) {
|
private void summarizeTimings(int count, String name, PerformanceInspector inspector, Map<String, Long> map, Function<Map.Entry<String, Long>, String> formatter) {
|
||||||
Stream<Map.Entry<String, Long>> stream = map.entrySet().stream();
|
Set<Entry<String, Long>> entrySet = map.entrySet();
|
||||||
List<Entry<String, Long>> results = stream.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).collect(Collectors.toList());
|
List<Entry<String, Long>> results = inspector.getOrderType().sort(profiler, entrySet);
|
||||||
String prefix = count + " " + name + (count != 1 ? 's' : "");
|
String prefix = count + " " + name + (count != 1 ? 's' : "");
|
||||||
|
|
||||||
if (inspector instanceof PlayerPerformanceInspector playerPerformanceInspector) {
|
if (inspector instanceof PlayerPerformanceInspector playerPerformanceInspector) {
|
||||||
@ -181,22 +184,15 @@ class PerformanceSummary {
|
|||||||
rest--;
|
rest--;
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.append(ChatColor.DARK_GRAY);
|
builder.append(ChatColor.DARK_GRAY)
|
||||||
|
.append(":".repeat(Math.max(0, rest)))
|
||||||
for (int i = 0; i < rest; i++) {
|
.append(" - ")
|
||||||
builder.append(':');
|
.append(rating.getColor()).append(ChatUtils.humanize(rating.name()))
|
||||||
}
|
.append(ChatColor.GRAY)
|
||||||
|
.append(" (")
|
||||||
builder.append(" - ");
|
.append(NumberUtils.roundDecimalNumber(percentage))
|
||||||
|
.append("%)");
|
||||||
builder.append(rating.getColor() + ChatUtils.humanize(rating.name()));
|
|
||||||
|
|
||||||
builder.append(ChatColor.GRAY);
|
|
||||||
builder.append(" (");
|
|
||||||
builder.append(NumberUtils.roundDecimalNumber(percentage));
|
|
||||||
builder.append("%)");
|
|
||||||
|
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,55 @@
|
|||||||
|
package io.github.thebusybiscuit.slimefun4.core.services.profiler;
|
||||||
|
|
||||||
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds the different types of ordering for summaries.
|
||||||
|
*
|
||||||
|
* @author Walshy
|
||||||
|
*/
|
||||||
|
public enum SummaryOrderType {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sort by highest to the lowest total timings
|
||||||
|
*/
|
||||||
|
HIGHEST,
|
||||||
|
/**
|
||||||
|
* Sort by lowest to the highest total timings
|
||||||
|
*/
|
||||||
|
LOWEST,
|
||||||
|
/**
|
||||||
|
* Sort by average timings (highest to lowest)
|
||||||
|
*/
|
||||||
|
AVERAGE;
|
||||||
|
|
||||||
|
@ParametersAreNonnullByDefault
|
||||||
|
List<Map.Entry<String, Long>> sort(SlimefunProfiler profiler, Set<Map.Entry<String, Long>> entrySet) {
|
||||||
|
switch(this) {
|
||||||
|
case HIGHEST:
|
||||||
|
return entrySet.stream()
|
||||||
|
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
case LOWEST:
|
||||||
|
return entrySet.stream()
|
||||||
|
.sorted(Comparator.comparingLong(Map.Entry::getValue))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
default:
|
||||||
|
final Map<String, Long> map = new HashMap<>();
|
||||||
|
for (Map.Entry<String, Long> entry : entrySet) {
|
||||||
|
int count = profiler.getBlocksOfId(entry.getKey());
|
||||||
|
long avg = count > 0 ? entry.getValue() / count : entry.getValue();
|
||||||
|
|
||||||
|
map.put(entry.getKey(), avg);
|
||||||
|
}
|
||||||
|
return map.entrySet().stream()
|
||||||
|
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,9 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.core.services.profiler.inspectors;
|
package io.github.thebusybiscuit.slimefun4.core.services.profiler.inspectors;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.ParametersAreNonnullByDefault;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.core.services.profiler.SummaryOrderType;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.command.ConsoleCommandSender;
|
import org.bukkit.command.ConsoleCommandSender;
|
||||||
@ -28,35 +30,61 @@ public class ConsolePerformanceInspector implements PerformanceInspector {
|
|||||||
*/
|
*/
|
||||||
private final boolean verbose;
|
private final boolean verbose;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The order type of the timings.
|
||||||
|
*/
|
||||||
|
private final SummaryOrderType orderType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This creates a new {@link ConsolePerformanceInspector} for the given {@link CommandSender}.
|
* This creates a new {@link ConsolePerformanceInspector} for the given {@link CommandSender}.
|
||||||
*
|
*
|
||||||
* @param console
|
* @param console
|
||||||
* The {@link CommandSender}, preferabbly a {@link ConsoleCommandSender}
|
* The {@link CommandSender}, preferably a {@link ConsoleCommandSender}
|
||||||
* @param verbose
|
* @param verbose
|
||||||
* Whether the summary will be verbose or not
|
* Whether the summary will be verbose or not
|
||||||
|
* @param orderType
|
||||||
|
* The {@link SummaryOrderType} of the timings
|
||||||
*/
|
*/
|
||||||
public ConsolePerformanceInspector(@Nonnull CommandSender console, boolean verbose) {
|
@ParametersAreNonnullByDefault
|
||||||
|
public ConsolePerformanceInspector(CommandSender console, boolean verbose, SummaryOrderType orderType) {
|
||||||
Validate.notNull(console, "CommandSender cannot be null");
|
Validate.notNull(console, "CommandSender cannot be null");
|
||||||
|
Validate.notNull(orderType, "SummaryOrderType cannot be null");
|
||||||
|
|
||||||
this.console = console;
|
this.console = console;
|
||||||
this.verbose = verbose;
|
this.verbose = verbose;
|
||||||
|
this.orderType = orderType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isValid() {
|
public boolean isValid() {
|
||||||
// The console is always "online".
|
// The console is always "online".
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isVerbose() {
|
public boolean isVerbose() {
|
||||||
return verbose;
|
return verbose;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public @Nonnull SummaryOrderType getOrderType() {
|
||||||
|
return orderType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(@Nonnull String msg) {
|
public void sendMessage(@Nonnull String msg) {
|
||||||
console.sendMessage(msg);
|
console.sendMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import java.util.UUID;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.core.services.profiler.SummaryOrderType;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -27,34 +28,62 @@ public class PlayerPerformanceInspector implements PerformanceInspector {
|
|||||||
*/
|
*/
|
||||||
private final UUID uuid;
|
private final UUID uuid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The order type of the timings.
|
||||||
|
*/
|
||||||
|
private final SummaryOrderType orderType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This creates a new {@link PlayerPerformanceInspector} for the given {@link Player}.
|
* This creates a new {@link PlayerPerformanceInspector} for the given {@link Player}.
|
||||||
*
|
*
|
||||||
* @param player
|
* @param player
|
||||||
* The {@link Player}
|
* The {@link Player}
|
||||||
|
* @param orderType
|
||||||
|
* The {@link SummaryOrderType} of the timings
|
||||||
*/
|
*/
|
||||||
public PlayerPerformanceInspector(@Nonnull Player player) {
|
public PlayerPerformanceInspector(@Nonnull Player player, @Nonnull SummaryOrderType orderType) {
|
||||||
Validate.notNull(player, "Player cannot be null");
|
Validate.notNull(player, "Player cannot be null");
|
||||||
|
Validate.notNull(orderType, "SummaryOrderType cannot be null");
|
||||||
|
|
||||||
this.uuid = player.getUniqueId();
|
this.uuid = player.getUniqueId();
|
||||||
|
this.orderType = orderType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
/**
|
||||||
private Player getPlayer() {
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
private @Nullable Player getPlayer() {
|
||||||
return Bukkit.getPlayer(uuid);
|
return Bukkit.getPlayer(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isValid() {
|
public boolean isValid() {
|
||||||
Player player = getPlayer();
|
Player player = getPlayer();
|
||||||
return player != null && player.isOnline();
|
return player != null && player.isOnline();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isVerbose() {
|
public boolean isVerbose() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public @Nonnull SummaryOrderType getOrderType() {
|
||||||
|
return orderType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(@Nonnull String msg) {
|
public void sendMessage(@Nonnull String msg) {
|
||||||
Player player = getPlayer();
|
Player player = getPlayer();
|
||||||
|
Loading…
Reference in New Issue
Block a user