Cache command result, increases performance by an order of magnitude

This commit is contained in:
themode 2021-02-22 11:49:28 +01:00
parent 732fa0434a
commit b0185aa7e1

View File

@ -1,5 +1,7 @@
package net.minestom.server.command.builder; package net.minestom.server.command.builder;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import it.unimi.dsi.fastutil.ints.Int2ObjectRBTreeMap; import it.unimi.dsi.fastutil.ints.Int2ObjectRBTreeMap;
import net.minestom.server.command.CommandSender; import net.minestom.server.command.CommandSender;
import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.arguments.Argument;
@ -12,6 +14,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
@ -22,6 +25,10 @@ public class CommandDispatcher {
private final Map<String, Command> commandMap = new HashMap<>(); private final Map<String, Command> commandMap = new HashMap<>();
private final Set<Command> commands = new HashSet<>(); private final Set<Command> commands = new HashSet<>();
private final Cache<String, CommandResult> cache = CacheBuilder.newBuilder()
.expireAfterWrite(30, TimeUnit.SECONDS)
.build();
/** /**
* Registers a command, * Registers a command,
* be aware that registering a command name or alias will override the previous entry. * be aware that registering a command name or alias will override the previous entry.
@ -99,6 +106,14 @@ public class CommandDispatcher {
public CommandResult parse(@NotNull String commandString) { public CommandResult parse(@NotNull String commandString) {
commandString = commandString.trim(); commandString = commandString.trim();
// Verify if the result is cached
{
final CommandResult cachedResult = cache.getIfPresent(commandString);
if (cachedResult != null) {
return cachedResult;
}
}
// Split space // Split space
final String[] parts = commandString.split(StringUtils.SPACE); final String[] parts = commandString.split(StringUtils.SPACE);
final String commandName = parts[0]; final String commandName = parts[0];
@ -119,6 +134,12 @@ public class CommandDispatcher {
result.input = commandString; result.input = commandString;
// Find the used syntax and fill CommandResult#type and CommandResult#parsedCommand // Find the used syntax and fill CommandResult#type and CommandResult#parsedCommand
findParsedCommand(command, args, result); findParsedCommand(command, args, result);
// Cache result
{
this.cache.put(commandString, result);
}
return result; return result;
} }