2020-05-06 11:48:49 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2020-04-13 00:31:14 +02:00
|
|
|
From: Spottedleaf <spottedleaf@spottedleaf.dev>
|
|
|
|
Date: Mon, 6 Apr 2020 17:39:25 -0700
|
|
|
|
Subject: [PATCH] Reduce memory footprint of NBTTagCompound
|
|
|
|
|
|
|
|
Fastutil maps are going to have a lower memory footprint - which
|
|
|
|
is important because we clone chunk data after reading it for safety.
|
|
|
|
So, reduce the impact of the clone on GC.
|
|
|
|
|
2021-03-16 08:19:45 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/nbt/NBTTagCompound.java b/src/main/java/net/minecraft/nbt/NBTTagCompound.java
|
2021-04-23 23:08:56 +02:00
|
|
|
index d5508deff819309034554abc7b36aac40fa33503..77afbaad5b2cb8d912f5404fcbd3a0970490f4f3 100644
|
2021-03-16 08:19:45 +01:00
|
|
|
--- a/src/main/java/net/minecraft/nbt/NBTTagCompound.java
|
|
|
|
+++ b/src/main/java/net/minecraft/nbt/NBTTagCompound.java
|
|
|
|
@@ -26,6 +26,7 @@ import net.minecraft.ReportedException;
|
|
|
|
import net.minecraft.network.chat.ChatComponentText;
|
|
|
|
import net.minecraft.network.chat.IChatBaseComponent;
|
|
|
|
import net.minecraft.network.chat.IChatMutableComponent;
|
2020-08-25 04:22:08 +02:00
|
|
|
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; // Paper
|
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
|
2021-03-16 08:19:45 +01:00
|
|
|
@@ -47,7 +48,7 @@ public class NBTTagCompound implements NBTBase {
|
2020-04-13 00:31:14 +02:00
|
|
|
if (i > 512) {
|
|
|
|
throw new RuntimeException("Tried to read NBT tag with too high complexity, depth > 512");
|
|
|
|
} else {
|
|
|
|
- HashMap hashmap = Maps.newHashMap();
|
2020-08-25 04:22:08 +02:00
|
|
|
+ Object2ObjectOpenHashMap<String, NBTBase> hashmap = new Object2ObjectOpenHashMap<>(8, 0.8f); // Paper - reduce memory footprint of NBTTagCompound
|
2020-04-13 00:31:14 +02:00
|
|
|
|
|
|
|
byte b0;
|
|
|
|
|
2021-03-16 08:19:45 +01:00
|
|
|
@@ -83,7 +84,7 @@ public class NBTTagCompound implements NBTBase {
|
2020-04-13 00:31:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public NBTTagCompound() {
|
|
|
|
- this(Maps.newHashMap());
|
2020-08-25 04:22:08 +02:00
|
|
|
+ this(new Object2ObjectOpenHashMap<>(8, 0.8f)); // Paper - reduce memory footprint of NBTTagCompound
|
2020-04-13 00:31:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2021-04-23 23:08:56 +02:00
|
|
|
@@ -417,9 +418,17 @@ public class NBTTagCompound implements NBTBase {
|
2020-04-13 00:31:14 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public NBTTagCompound clone() {
|
|
|
|
- Map<String, NBTBase> map = Maps.newHashMap(Maps.transformValues(this.map, NBTBase::clone));
|
|
|
|
+ // Paper start - reduce memory footprint of NBTTagCompound
|
2020-08-25 04:22:08 +02:00
|
|
|
+ Object2ObjectOpenHashMap<String, NBTBase> ret = new Object2ObjectOpenHashMap<>(this.map.size(), 0.8f);
|
2020-04-13 00:31:14 +02:00
|
|
|
|
|
|
|
- return new NBTTagCompound(map);
|
2020-08-25 04:22:08 +02:00
|
|
|
+ Iterator<Map.Entry<String, NBTBase>> iterator = (this.map instanceof Object2ObjectOpenHashMap) ? ((Object2ObjectOpenHashMap)this.map).object2ObjectEntrySet().fastIterator() : this.map.entrySet().iterator();
|
2020-04-13 00:31:14 +02:00
|
|
|
+ while (iterator.hasNext()) {
|
|
|
|
+ Map.Entry<String, NBTBase> entry = iterator.next();
|
|
|
|
+ ret.put(entry.getKey(), entry.getValue().clone());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return new NBTTagCompound(ret);
|
|
|
|
+ // Paper end - reduce memory footprint of NBTTagCompound
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean equals(Object object) {
|