Optimize PooledBuffers

Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
TheMode 2021-11-21 13:15:29 +01:00
parent 81553e2816
commit 098885cc7f

View File

@ -1,35 +1,32 @@
package net.minestom.server.utils.binary; package net.minestom.server.utils.binary;
import org.jctools.queues.MessagePassingQueue;
import org.jctools.queues.MpmcUnboundedXaddArrayQueue;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import java.lang.ref.Cleaner; import java.lang.ref.Cleaner;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
import java.util.Collection; import java.util.Collection;
import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
@ApiStatus.Internal @ApiStatus.Internal
@ApiStatus.Experimental @ApiStatus.Experimental
public final class PooledBuffers { public final class PooledBuffers {
private final static Queue<SoftReference<BinaryBuffer>> POOLED_BUFFERS = new ConcurrentLinkedQueue<>(); private final static MessagePassingQueue<SoftReference<BinaryBuffer>> POOLED_BUFFERS = new MpmcUnboundedXaddArrayQueue<>(1024);
private final static int BUFFER_SIZE = Integer.getInteger("minestom.pooled-buffer-size", 262_143); private final static int BUFFER_SIZE = Integer.getInteger("minestom.pooled-buffer-size", 262_143);
private final static Cleaner CLEANER = Cleaner.create(); private final static Cleaner CLEANER = Cleaner.create();
public static BinaryBuffer get() { public static BinaryBuffer get() {
BinaryBuffer buffer = null; BinaryBuffer buffer;
SoftReference<BinaryBuffer> ref; SoftReference<BinaryBuffer> ref;
while ((ref = POOLED_BUFFERS.poll()) != null) { while ((ref = POOLED_BUFFERS.relaxedPoll()) != null) {
buffer = ref.get(); if ((buffer = ref.get()) != null) return buffer;
if (buffer != null) break;
} }
return Objects.requireNonNullElseGet(buffer, () -> BinaryBuffer.ofSize(BUFFER_SIZE)); return BinaryBuffer.ofSize(BUFFER_SIZE);
} }
public static void add(BinaryBuffer buffer) { public static void add(BinaryBuffer buffer) {
buffer.clear(); POOLED_BUFFERS.relaxedOffer(new SoftReference<>(buffer.clear()));
POOLED_BUFFERS.add(new SoftReference<>(buffer));
} }
public static int count() { public static int count() {