diff --git a/README.md b/README.md index 749627c8..97c804b6 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,7 @@ See the patches list below. [SportPaper-0201] Cache block break animation packet [SportPaper-0203] Fix Teleport Invisibility [SportPaper-0204] Optimize toLegacyData removing unneeded sanity checks +[SportPaper-0108] Optimize Network Queue [PaperBin-????] WorldServer#everyoneDeeplySleeping optimization diff --git a/WindSpigot-Server/src/main/java/io/papermc/paper/util/linkedqueue/CachedSizeConcurrentLinkedQueue.java b/WindSpigot-Server/src/main/java/io/papermc/paper/util/linkedqueue/CachedSizeConcurrentLinkedQueue.java new file mode 100644 index 00000000..5f59b67b --- /dev/null +++ b/WindSpigot-Server/src/main/java/io/papermc/paper/util/linkedqueue/CachedSizeConcurrentLinkedQueue.java @@ -0,0 +1,31 @@ +package io.papermc.paper.util.linkedqueue; + +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.LongAdder; + +public class CachedSizeConcurrentLinkedQueue extends ConcurrentLinkedQueue { + private final LongAdder cachedSize = new LongAdder(); + + @Override + public boolean add(E e) { + boolean result = super.add(e); + if (result) { + cachedSize.increment(); + } + return result; + } + + @Override + public E poll() { + E result = super.poll(); + if (result != null) { + cachedSize.decrement(); + } + return result; + } + + @Override + public int size() { + return cachedSize.intValue(); + } +} \ No newline at end of file diff --git a/WindSpigot-Server/src/main/java/net/minecraft/server/MinecraftServer.java b/WindSpigot-Server/src/main/java/net/minecraft/server/MinecraftServer.java index 465521e2..4ac718fa 100644 --- a/WindSpigot-Server/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/WindSpigot-Server/src/main/java/net/minecraft/server/MinecraftServer.java @@ -25,6 +25,7 @@ import javax.imageio.ImageIO; import ga.windpvp.windspigot.random.FastRandom; +import io.papermc.paper.util.linkedqueue.CachedSizeConcurrentLinkedQueue; import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -122,9 +123,7 @@ public int getServerPort() { private long X = 0L; private final GameProfileRepository Y; private final UserCache Z; - protected final Queue> j = new java.util.concurrent.ConcurrentLinkedQueue>(); // Spigot, - // PAIL: - // Rename + protected final Queue> j = new CachedSizeConcurrentLinkedQueue<>(); // Spigot, PAIL: Rename // Paper - Make size() constant-time private Thread serverThread; private long ab = az();