import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import java.util.ArrayDeque; import java.util.Random; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MICROSECONDS) @State(Scope.Thread) @Fork(1) @Warmup(iterations = 3, time = 10) @Measurement(iterations = 5, time = 10) public class ListBenchmark { @Param({"65536"}) private int capacity; private EvictingRingList ringList; private ArrayDeque arrayDeque; private int[] indices; @Setup public void setup() { ringList = new EvictingRingList<>(capacity); arrayDeque = new ArrayDeque<>(capacity); Random random = new Random(42); indices = new int[1000]; for (int i = 0; i < 1000; i++) { indices[i] = random.nextInt(capacity); } for (int i = 0; i < capacity; i++) { ringList.add(i); arrayDeque.add(i); } } @Benchmark public void testAdd(Blackhole bh) { ringList.add(100); bh.consume(ringList); } @Benchmark public void testArrayDequeAddManualEvict(Blackhole bh) { if (arrayDeque.size() >= capacity) { arrayDeque.removeFirst(); } arrayDeque.addLast(100); bh.consume(arrayDeque); } }