From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Mon, 23 Jul 2018 13:08:19 -0400 Subject: [PATCH] Optimize IntIdentityHashBiMiap#nextId() Optimizes CrudeIncrementalIntIdentityHashBiMap#nextId() This is a frequent hotspot for world loading/saving. 1.18 todo: seems like the bitset is too small now? removing this patch fixed lots of issues related to synchedentitydata and structure gen diff --git a/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java b/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java index dc7528b41aa9a55807a2b3e33d5668e1be681e79..a002218caed08bf4a4072d934e1094c22ee35534 100644 --- a/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java +++ b/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java @@ -16,11 +16,13 @@ public class CrudeIncrementalIntIdentityHashBiMap implements IdMap { private K[] byId; private int nextId; private int size; + private java.util.BitSet usedIds; // Paper private CrudeIncrementalIntIdentityHashBiMap(int size) { this.keys = (K[])(new Object[size]); this.values = new int[size]; this.byId = (K[])(new Object[size]); + this.usedIds = new java.util.BitSet(); // Paper } public static CrudeIncrementalIntIdentityHashBiMap create(int expectedSize) { @@ -57,9 +59,13 @@ public class CrudeIncrementalIntIdentityHashBiMap implements IdMap { } private int nextId() { + /* // Paper start while(this.nextId < this.byId.length && this.byId[this.nextId] != null) { ++this.nextId; } + */ + this.nextId = this.usedIds.nextClearBit(0); + // Paper end return this.nextId; } @@ -80,6 +86,7 @@ public class CrudeIncrementalIntIdentityHashBiMap implements IdMap { this.byId = crudeIncrementalIntIdentityHashBiMap.byId; this.nextId = crudeIncrementalIntIdentityHashBiMap.nextId; this.size = crudeIncrementalIntIdentityHashBiMap.size; + this.usedIds.clear(); // Paper } public void addMapping(K value, int id) { @@ -96,6 +103,7 @@ public class CrudeIncrementalIntIdentityHashBiMap implements IdMap { this.keys[k] = value; this.values[k] = id; this.byId[id] = value; + this.usedIds.set(id); // Paper ++this.size; if (id == this.nextId) { ++this.nextId; @@ -157,6 +165,7 @@ public class CrudeIncrementalIntIdentityHashBiMap implements IdMap { Arrays.fill(this.byId, (Object)null); this.nextId = 0; this.size = 0; + this.usedIds.clear(); // Paper } @Override