Optimise countEntries for low size SimpleBitStorage

We can use a simple array lookup table by palette id when the
number of palette entries is low. This eliminates the need for
the map lookup on each entry.
This commit is contained in:
Spottedleaf
2024-09-17 16:29:23 -07:00
parent 1374ea34ee
commit c2e2f0b9f2

View File

@@ -25,10 +25,6 @@ abstract class SimpleBitStorageMixin implements BitStorage, BlockCountingBitStor
@Final
private int bits;
@Shadow
@Final
private long mask;
@Shadow
@Final
private int size;
@@ -37,31 +33,58 @@ abstract class SimpleBitStorageMixin implements BitStorage, BlockCountingBitStor
public final Int2ObjectOpenHashMap<ShortArrayList> moonrise$countEntries() {
final int valuesPerLong = this.valuesPerLong;
final int bits = this.bits;
final long mask = this.mask;
final long mask = (1L << bits) - 1L;
final int size = this.size;
// we may be backed by global palette, so limit bits for init capacity
final Int2ObjectOpenHashMap<ShortArrayList> ret = new Int2ObjectOpenHashMap<>(
1 << Math.min(6, bits)
);
if (bits <= 6) {
final ShortArrayList[] byId = new ShortArrayList[1 << bits];
final Int2ObjectOpenHashMap<ShortArrayList> ret = new Int2ObjectOpenHashMap<>(1 << bits);
int index = 0;
int index = 0;
for (long value : this.data) {
int li = 0;
do {
final int paletteIdx = (int)(value & mask);
value >>= bits;
for (long value : this.data) {
int li = 0;
do {
final int paletteIdx = (int)(value & mask);
value >>= bits;
++li;
ret.computeIfAbsent(paletteIdx, (final int key) -> {
return new ShortArrayList(64);
}).add((short)index);
final ShortArrayList coords = byId[paletteIdx];
if (coords != null) {
coords.add((short)index++);
continue;
} else {
final ShortArrayList newCoords = new ShortArrayList(64);
byId[paletteIdx] = newCoords;
newCoords.add((short)index++);
ret.put(paletteIdx, newCoords);
continue;
}
} while (li < valuesPerLong && index < size);
}
++li;
++index;
} while (li < valuesPerLong && index < size);
return ret;
} else {
final Int2ObjectOpenHashMap<ShortArrayList> ret = new Int2ObjectOpenHashMap<>(
1 << 6
);
int index = 0;
for (long value : this.data) {
int li = 0;
do {
final int paletteIdx = (int)(value & mask);
value >>= bits;
++li;
ret.computeIfAbsent(paletteIdx, (final int key) -> {
return new ShortArrayList(64);
}).add((short)index++);
} while (li < valuesPerLong && index < size);
}
return ret;
}
return ret;
}
}