From 098885cc7f76bcea6d2ce619a5e7889835151a8c Mon Sep 17 00:00:00 2001 From: TheMode Date: Sun, 21 Nov 2021 13:15:29 +0100 Subject: [PATCH] Optimize PooledBuffers Signed-off-by: TheMode --- .../server/utils/binary/PooledBuffers.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/minestom/server/utils/binary/PooledBuffers.java b/src/main/java/net/minestom/server/utils/binary/PooledBuffers.java index 669acdcbe..5fbaca4e4 100644 --- a/src/main/java/net/minestom/server/utils/binary/PooledBuffers.java +++ b/src/main/java/net/minestom/server/utils/binary/PooledBuffers.java @@ -1,35 +1,32 @@ package net.minestom.server.utils.binary; +import org.jctools.queues.MessagePassingQueue; +import org.jctools.queues.MpmcUnboundedXaddArrayQueue; import org.jetbrains.annotations.ApiStatus; import java.lang.ref.Cleaner; import java.lang.ref.SoftReference; import java.util.Collection; -import java.util.Objects; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicReference; @ApiStatus.Internal @ApiStatus.Experimental public final class PooledBuffers { - private final static Queue> POOLED_BUFFERS = new ConcurrentLinkedQueue<>(); + private final static MessagePassingQueue> POOLED_BUFFERS = new MpmcUnboundedXaddArrayQueue<>(1024); private final static int BUFFER_SIZE = Integer.getInteger("minestom.pooled-buffer-size", 262_143); private final static Cleaner CLEANER = Cleaner.create(); public static BinaryBuffer get() { - BinaryBuffer buffer = null; + BinaryBuffer buffer; SoftReference ref; - while ((ref = POOLED_BUFFERS.poll()) != null) { - buffer = ref.get(); - if (buffer != null) break; + while ((ref = POOLED_BUFFERS.relaxedPoll()) != null) { + if ((buffer = ref.get()) != null) return buffer; } - return Objects.requireNonNullElseGet(buffer, () -> BinaryBuffer.ofSize(BUFFER_SIZE)); + return BinaryBuffer.ofSize(BUFFER_SIZE); } public static void add(BinaryBuffer buffer) { - buffer.clear(); - POOLED_BUFFERS.add(new SoftReference<>(buffer)); + POOLED_BUFFERS.relaxedOffer(new SoftReference<>(buffer.clear())); } public static int count() {