2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Andrew Steinborn <git@steinborn.me>
|
|
|
|
Date: Mon, 23 Jul 2018 13:08:19 -0400
|
2021-06-12 23:31:35 +02:00
|
|
|
Subject: [PATCH] Optimize IntIdentityHashBiMiap#nextId()
|
|
|
|
|
|
|
|
Optimizes CrudeIncrementalIntIdentityHashBiMap#nextId()
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
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
|
2021-06-12 23:31:35 +02:00
|
|
|
index feaa9572a450b88a26659d850a269d09465259ee..62440dbb35263cddc90ba594c3d5777d7643e527 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java
|
|
|
|
+++ b/src/main/java/net/minecraft/util/CrudeIncrementalIntIdentityHashBiMap.java
|
2021-06-12 23:31:35 +02:00
|
|
|
@@ -16,12 +16,14 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
2021-06-11 14:02:28 +02:00
|
|
|
private K[] byId;
|
|
|
|
private int nextId;
|
|
|
|
private int size;
|
|
|
|
+ private java.util.BitSet usedIds; // Paper
|
|
|
|
|
|
|
|
public CrudeIncrementalIntIdentityHashBiMap(int size) {
|
2021-06-12 23:31:35 +02:00
|
|
|
size = (int)((float)size / 0.8F);
|
|
|
|
this.keys = (K[])(new Object[size]);
|
2021-06-11 14:02:28 +02:00
|
|
|
this.values = new int[size];
|
2021-06-12 23:31:35 +02:00
|
|
|
this.byId = (K[])(new Object[size]);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ this.usedIds = new java.util.BitSet(); // Paper
|
|
|
|
}
|
|
|
|
|
2021-06-12 23:31:35 +02:00
|
|
|
@Override
|
|
|
|
@@ -54,9 +56,13 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private int nextId() {
|
2021-06-12 23:31:35 +02:00
|
|
|
+ /* // Paper start
|
|
|
|
while(this.nextId < this.byId.length && this.byId[this.nextId] != null) {
|
|
|
|
++this.nextId;
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
+ */
|
|
|
|
+ this.nextId = this.usedIds.nextClearBit(0);
|
|
|
|
+ // Paper end
|
|
|
|
|
|
|
|
return this.nextId;
|
|
|
|
}
|
2021-06-12 23:31:35 +02:00
|
|
|
@@ -69,6 +75,7 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
|
|
|
this.byId = (K[])(new Object[newSize]);
|
2021-06-11 14:02:28 +02:00
|
|
|
this.nextId = 0;
|
|
|
|
this.size = 0;
|
|
|
|
+ this.usedIds.clear(); // Paper
|
|
|
|
|
2021-06-12 23:31:35 +02:00
|
|
|
for(int i = 0; i < objects.length; ++i) {
|
|
|
|
if (objects[i] != null) {
|
|
|
|
@@ -92,6 +99,7 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
2021-06-11 14:02:28 +02:00
|
|
|
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;
|
2021-06-12 23:31:35 +02:00
|
|
|
@@ -153,6 +161,7 @@ public class CrudeIncrementalIntIdentityHashBiMap<K> implements IdMap<K> {
|
|
|
|
Arrays.fill(this.byId, (Object)null);
|
2021-06-11 14:02:28 +02:00
|
|
|
this.nextId = 0;
|
|
|
|
this.size = 0;
|
|
|
|
+ this.usedIds.clear(); // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
public int size() {
|