diff --git a/modules/GuildManager/pom.xml b/modules/GuildManager/pom.xml index 4f5f6c8..3c96e01 100644 --- a/modules/GuildManager/pom.xml +++ b/modules/GuildManager/pom.xml @@ -111,7 +111,7 @@ me.clip placeholderapi - 2.11.1 + 2.11.6 provided @@ -120,6 +120,12 @@ 5.6.0-SNAPSHOT provided + + junit + junit + 4.13.2 + test + diff --git a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/sql/SQLManager.java b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/sql/SQLManager.java index 29cec3c..aa3e9be 100644 --- a/modules/GuildManager/src/main/java/com/mcatk/guildmanager/sql/SQLManager.java +++ b/modules/GuildManager/src/main/java/com/mcatk/guildmanager/sql/SQLManager.java @@ -5,8 +5,10 @@ import com.mcatk.guildmanager.models.Member; import java.sql.*; +import java.util.AbstractList; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; public class SQLManager { private Connection connection; @@ -23,6 +25,10 @@ private SQLManager() { guilds = getAllGuildsFromSQL(); } + protected SQLManager(HashMap guilds) { + this.guilds = guilds; + } + private void connectMySQL() { String ip = GuildManager.getPlugin().getConfig().getString("mysql.ip"); String databaseName = GuildManager.getPlugin().getConfig().getString("mysql.databasename"); @@ -142,12 +148,19 @@ public void removeMember(String playerID, String guildID) { } } - public ArrayList getGuildMembers(String id) { - ArrayList list = new ArrayList<>(); - for (Member m : guilds.get(id).getMembers()) { - list.add(m.getId()); - } - return list; + public List getGuildMembers(String id) { + final List members = guilds.get(id).getMembers(); + return new AbstractList() { + @Override + public String get(int index) { + return members.get(index).getId(); + } + + @Override + public int size() { + return members.size(); + } + }; } public ArrayList getGuildAdvancedMembers(String id) { diff --git a/modules/GuildManager/src/test/java/com/mcatk/guildmanager/sql/SQLManagerBenchmarkTest.java b/modules/GuildManager/src/test/java/com/mcatk/guildmanager/sql/SQLManagerBenchmarkTest.java new file mode 100644 index 0000000..971115b --- /dev/null +++ b/modules/GuildManager/src/test/java/com/mcatk/guildmanager/sql/SQLManagerBenchmarkTest.java @@ -0,0 +1,56 @@ +package com.mcatk.guildmanager.sql; + +import com.mcatk.guildmanager.models.Guild; +import com.mcatk.guildmanager.models.Member; +import org.junit.Test; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class SQLManagerBenchmarkTest { + + @Test + public void testBenchmark() throws Exception { + // Setup + HashMap guilds = new HashMap<>(); + String guildId = "test_guild"; + Guild guild = new Guild(); + guild.setId(guildId); + + ArrayList members = new ArrayList<>(); + int memberCount = 1000; + for (int i = 0; i < memberCount; i++) { + members.add(new Member("player_" + i, guildId, 0, false)); + } + guild.setMembers(members); + guilds.put(guildId, guild); + + // Inject into SQLManager + SQLManager instance = new SQLManager(guilds); + Field f = SQLManager.class.getDeclaredField("instance"); + f.setAccessible(true); + f.set(null, instance); + + // Warmup + for (int i = 0; i < 10000; i++) { + SQLManager.getInstance().getGuildMembers(guildId); + } + + // Benchmark + long start = System.nanoTime(); + int iterations = 100000; + for (int i = 0; i < iterations; i++) { + List result = SQLManager.getInstance().getGuildMembers(guildId); + if (result.size() != memberCount) { + throw new RuntimeException("Size mismatch"); + } + } + long end = System.nanoTime(); + + double durationMs = (end - start) / 1_000_000.0; + System.out.println("Benchmark finished in " + durationMs + " ms for " + iterations + " iterations."); + System.out.println("Average time per call: " + (durationMs / iterations) + " ms"); + } +}