Skip to content

Commit 99f7a49

Browse files
authored
Improve gc command performance (#6439)
Updates /gc to use the new provider methods, allowing Paper to use getTileEntities(false) and avoid unnecessary snapshots while maintaining spigot compatibility. "Benchmarks:" Before, Paper: https://spark.lucko.me/kf2MVRQ5td - 76mspt After, Paper: https://spark.lucko.me/NhZQXtLqvh - 1mspt Spigot: https://spark.lucko.me/toXyvx0yq0
1 parent bc6acfe commit 99f7a49

5 files changed

Lines changed: 55 additions & 1 deletion

File tree

Essentials/src/main/java/com/earth2me/essentials/Essentials.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import net.ess3.provider.providers.BlockMetaSpawnerItemProvider;
7171
import net.ess3.provider.providers.BukkitMaterialTagProvider;
7272
import net.ess3.provider.providers.BukkitSpawnerBlockProvider;
73+
import net.ess3.provider.providers.BukkitTileEntityProvider;
7374
import net.ess3.provider.providers.FixedHeightWorldInfoProvider;
7475
import net.ess3.provider.providers.FlatSpawnEggProvider;
7576
import net.ess3.provider.providers.LegacyBannerDataProvider;
@@ -96,6 +97,7 @@
9697
import net.ess3.provider.providers.PaperSerializationProvider;
9798
import net.ess3.provider.providers.PaperServerStateProvider;
9899
import net.ess3.provider.providers.PaperTickCountProvider;
100+
import net.ess3.provider.providers.PaperTileEntityProvider;
99101
import net.ess3.provider.providers.PrehistoricPotionMetaProvider;
100102
import net.essentialsx.api.v2.services.BalanceTop;
101103
import net.essentialsx.api.v2.services.mail.MailService;
@@ -385,6 +387,9 @@ public void onEnable() {
385387
// Biome Key Provider
386388
providerFactory.registerProvider(PaperBiomeKeyProvider.class);
387389

390+
// Tile Entity Provider
391+
providerFactory.registerProvider(BukkitTileEntityProvider.class, PaperTileEntityProvider.class);
392+
388393
// Tick Count Provider
389394
providerFactory.registerProvider(PaperTickCountProvider.class);
390395

Essentials/src/main/java/com/earth2me/essentials/commands/Commandgc.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.earth2me.essentials.CommandSource;
44
import com.earth2me.essentials.utils.DateUtil;
55
import com.earth2me.essentials.utils.NumberUtil;
6+
import net.ess3.provider.TileEntityProvider;
67
import org.bukkit.ChatColor;
78
import org.bukkit.Chunk;
89
import org.bukkit.Server;
@@ -36,6 +37,7 @@ protected void run(final Server server, final CommandSource sender, final String
3637
sender.sendTl("gcfree", Runtime.getRuntime().freeMemory() / 1024 / 1024);
3738

3839
final List<World> worlds = server.getWorlds();
40+
final TileEntityProvider tileEntityProvider = ess.provider(TileEntityProvider.class);
3941
for (final World w : worlds) {
4042
String worldType = "World";
4143
switch (w.getEnvironment()) {
@@ -51,7 +53,7 @@ protected void run(final Server server, final CommandSource sender, final String
5153

5254
try {
5355
for (final Chunk chunk : w.getLoadedChunks()) {
54-
tileEntities += chunk.getTileEntities().length;
56+
tileEntities += tileEntityProvider.getTileEntities(chunk).length;
5557
}
5658
} catch (final java.lang.ClassCastException ex) {
5759
ess.getLogger().log(Level.SEVERE, "Corrupted chunk data on world " + w, ex);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package net.ess3.provider;
2+
3+
import org.bukkit.Chunk;
4+
import org.bukkit.block.BlockState;
5+
6+
public interface TileEntityProvider extends Provider {
7+
BlockState[] getTileEntities(Chunk chunk);
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package net.ess3.provider.providers;
2+
3+
import net.ess3.provider.TileEntityProvider;
4+
import net.essentialsx.providers.ProviderData;
5+
import org.bukkit.Chunk;
6+
import org.bukkit.block.BlockState;
7+
8+
@ProviderData(description = "Bukkit Tile Entity Provider")
9+
public class BukkitTileEntityProvider implements TileEntityProvider {
10+
@Override
11+
public BlockState[] getTileEntities(Chunk chunk) {
12+
return chunk.getTileEntities();
13+
}
14+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.ess3.provider.providers;
2+
3+
import net.ess3.provider.TileEntityProvider;
4+
import net.essentialsx.providers.ProviderData;
5+
import net.essentialsx.providers.ProviderTest;
6+
import org.bukkit.Chunk;
7+
import org.bukkit.block.BlockState;
8+
9+
@ProviderData(description = "Paper 1.13+ Tile Entity Provider", weight = 1)
10+
public class PaperTileEntityProvider implements TileEntityProvider {
11+
@Override
12+
public BlockState[] getTileEntities(Chunk chunk) {
13+
return chunk.getTileEntities(false);
14+
}
15+
16+
@ProviderTest
17+
public static boolean test() {
18+
try {
19+
Chunk.class.getDeclaredMethod("getTileEntities", boolean.class);
20+
return true;
21+
} catch (final NoSuchMethodException ignored) {
22+
return false;
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)