4104545b11
"It was from a different time before books were as jank as they are now. As time has gone on they've only proven to be worse and worse."
66 lines
2.5 KiB
Diff
66 lines
2.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Andrew Steinborn <git@steinborn.me>
|
|
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.
|
|
|
|
diff --git a/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java b/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java
|
|
index feaa9572a450b88a26659d850a269d09465259ee..62440dbb35263cddc90ba594c3d5777d7643e527 100644
|
|
--- a/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java
|
|
+++ b/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java
|
|
@@ -16,12 +16,14 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
|
private K[] byId;
|
|
private int nextId;
|
|
private int size;
|
|
+ private java.util.BitSet usedIds; // Paper
|
|
|
|
public CrudeIncrementalIntIdentityHashBiMap(int size) {
|
|
size = (int)((float)size / 0.8F);
|
|
this.keys = (K[])(new Object[size]);
|
|
this.values = new int[size];
|
|
this.byId = (K[])(new Object[size]);
|
|
+ this.usedIds = new java.util.BitSet(); // Paper
|
|
}
|
|
|
|
@Override
|
|
@@ -54,9 +56,13 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
|
}
|
|
|
|
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;
|
|
}
|
|
@@ -69,6 +75,7 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
|
this.byId = (K[])(new Object[newSize]);
|
|
this.nextId = 0;
|
|
this.size = 0;
|
|
+ this.usedIds.clear(); // Paper
|
|
|
|
for(int i = 0; i < objects.length; ++i) {
|
|
if (objects[i] != null) {
|
|
@@ -92,6 +99,7 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
|
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;
|
|
@@ -153,6 +161,7 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
|
Arrays.fill(this.byId, (Object)null);
|
|
this.nextId = 0;
|
|
this.size = 0;
|
|
+ this.usedIds.clear(); // Paper
|
|
}
|
|
|
|
public int size() {
|