From 29017c1d9b99041ad0b2f65a3200079874dadd99 Mon Sep 17 00:00:00 2001 From: themode Date: Fri, 7 Jan 2022 03:34:27 +0100 Subject: [PATCH] Add PaletteGetPresentBenchmark --- .../palette/PaletteGetPresentBenchmark.java | 44 +++++++++++++++++++ .../server/instance/palette/PaletteImpl.java | 31 +++++++++---- 2 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteGetPresentBenchmark.java diff --git a/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteGetPresentBenchmark.java b/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteGetPresentBenchmark.java new file mode 100644 index 000000000..63fde7c4f --- /dev/null +++ b/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteGetPresentBenchmark.java @@ -0,0 +1,44 @@ +package net.minestom.jmh.palette; + +import net.minestom.server.instance.palette.Palette; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; + +@Warmup(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS) +@Measurement(iterations = 10, time = 1000, timeUnit = TimeUnit.MILLISECONDS) +@Fork(3) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +public class PaletteGetPresentBenchmark { + + @Param({"0", "0.25", "0.5", "0.75", "1"}) + public double fullness; + + private Palette palette; + + @Setup + public void setup() { + palette = Palette.blocks(); + var random = ThreadLocalRandom.current(); + final int dimension = palette.dimension(); + for (int y = 0; y < dimension; y++) + for (int z = 0; z < dimension; z++) + for (int x = 0; x < dimension; x++) + if (random.nextDouble() < fullness) + palette.set(x, y, z, random.nextInt(1, 16)); + } + + @Benchmark + public void readAll(Blackhole blackHole) { + palette.getAll((x, y, z, value) -> blackHole.consume(value)); + } + + @Benchmark + public void readAllPresent(Blackhole blackHole) { + palette.getAllPresent((x, y, z, value) -> blackHole.consume(value)); + } +} diff --git a/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java b/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java index 282a43be3..fab4c8909 100644 --- a/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java +++ b/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java @@ -95,10 +95,11 @@ final class PaletteImpl implements Palette, Cloneable { getAllOptional(consumer, false); } - void getAllOptional(@NotNull EntryConsumer consumer, boolean empty) { + void getAllOptional(@NotNull EntryConsumer consumer, boolean consumeEmpty) { final long[] values = this.values; + final int dimension = this.dimension; if (values.length == 0) { - if (empty) { + if (consumeEmpty) { // No values, give all 0 to make the consumer happy for (int y = 0; y < dimension; y++) for (int z = 0; z < dimension; z++) @@ -119,16 +120,30 @@ final class PaletteImpl implements Palette, Cloneable { final long value = values[i]; final int startIndex = i * valuesPerLong; final int maxIndex = startIndex + valuesPerLong > size ? size - startIndex : valuesPerLong; - if (value == 0 && !empty) continue; + if (value == 0) { + // No values in this long, skip + if (consumeEmpty) { + for (int j = 0; j < maxIndex; j++) { + final int index = startIndex + j; + final int y = index >> shiftedDimensionBitCount; + final int z = index >> dimensionBitCount & dimensionMinus; + final int x = index & dimensionMinus; + consumer.accept(x, y, z, 0); + } + } + continue; + } for (int j = 0; j < maxIndex; j++) { final int index = startIndex + j; - final int y = index >> shiftedDimensionBitCount; - final int z = index >> dimensionBitCount & dimensionMinus; - final int x = index & dimensionMinus; final int bitIndex = j * bitsPerEntry; final short paletteIndex = (short) (value >> bitIndex & magicMask); - final int result = ids != null ? ids[paletteIndex] : paletteIndex; - if (result != 0 || empty) consumer.accept(x, y, z, result); + if (paletteIndex != 0 || consumeEmpty) { + final int result = ids != null ? ids[paletteIndex] : paletteIndex; + final int y = index >> shiftedDimensionBitCount; + final int z = index >> dimensionBitCount & dimensionMinus; + final int x = index & dimensionMinus; + consumer.accept(x, y, z, result); + } } } }