PaperMC/CraftBukkit-Patches/0053-Optimize-DataWatcher.patch

137 lines
6.3 KiB
Diff

From 4e418f9a238858b1c13a6290ff5b667331073cb0 Mon Sep 17 00:00:00 2001
From: md_5 <git@md-5.net>
Date: Fri, 13 Dec 2013 11:45:47 +1100
Subject: [PATCH] Optimize DataWatcher
Use primitive orientated collections, as well as more effective copies across collections.
diff --git a/src/main/java/net/minecraft/server/DataWatcher.java b/src/main/java/net/minecraft/server/DataWatcher.java
index 2bf9196..aa46c28 100644
--- a/src/main/java/net/minecraft/server/DataWatcher.java
+++ b/src/main/java/net/minecraft/server/DataWatcher.java
@@ -15,8 +15,13 @@ public class DataWatcher {
private final Entity a;
private boolean b = true;
- private static final Map<Class<?>, Integer> c = Maps.newHashMap();
- private final Map<Integer, DataWatcher.WatchableObject> d = Maps.newHashMap();
+ // Spigot Start
+ private static final gnu.trove.map.TObjectIntMap classToId = new gnu.trove.map.hash.TObjectIntHashMap( 10, 0.5f, -1 );
+ private final gnu.trove.map.TIntObjectMap dataValues = new gnu.trove.map.hash.TIntObjectHashMap( 10, 0.5f, -1 );
+ // These exist as an attempt at backwards compatability for (broken) NMS plugins
+ private static final Map<Class<?>, Integer> c = gnu.trove.TDecorators.wrap( classToId );
+ private final Map<Integer, DataWatcher.WatchableObject> d = gnu.trove.TDecorators.wrap( dataValues );
+ // Spigot End
private boolean e;
private ReadWriteLock f = new ReentrantReadWriteLock();
@@ -25,19 +30,19 @@ public class DataWatcher {
}
public <T> void a(int i, T t0) {
- Integer integer = (Integer) DataWatcher.c.get(t0.getClass());
+ int integer = classToId.get(t0.getClass()); // Spigot
- if (integer == null) {
+ if (integer == -1) { // Spigot
throw new IllegalArgumentException("Unknown data type: " + t0.getClass());
} else if (i > 31) {
throw new IllegalArgumentException("Data value id is too big with " + i + "! (Max is " + 31 + ")");
- } else if (this.d.containsKey(Integer.valueOf(i))) {
+ } else if (this.dataValues.containsKey(i)) { // Spigot
throw new IllegalArgumentException("Duplicate id value for " + i + "!");
} else {
- DataWatcher.WatchableObject datawatcher_watchableobject = new DataWatcher.WatchableObject(integer.intValue(), i, t0);
+ DataWatcher.WatchableObject datawatcher_watchableobject = new DataWatcher.WatchableObject(integer, i, t0); // Spigot
this.f.writeLock().lock();
- this.d.put(Integer.valueOf(i), datawatcher_watchableobject);
+ this.dataValues.put(i, datawatcher_watchableobject); // Spigot
this.f.writeLock().unlock();
this.b = false;
}
@@ -47,7 +52,7 @@ public class DataWatcher {
DataWatcher.WatchableObject datawatcher_watchableobject = new DataWatcher.WatchableObject(j, i, (Object) null);
this.f.writeLock().lock();
- this.d.put(Integer.valueOf(i), datawatcher_watchableobject);
+ this.dataValues.put(i, datawatcher_watchableobject); // Spigot
this.f.writeLock().unlock();
this.b = false;
}
@@ -82,7 +87,7 @@ public class DataWatcher {
DataWatcher.WatchableObject datawatcher_watchableobject;
try {
- datawatcher_watchableobject = (DataWatcher.WatchableObject) this.d.get(Integer.valueOf(i));
+ datawatcher_watchableobject = (DataWatcher.WatchableObject) this.dataValues.get(i); // Spigot
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Getting synched entity data");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Synched entity data");
@@ -139,7 +144,7 @@ public class DataWatcher {
if (this.e) {
this.f.readLock().lock();
- Iterator iterator = this.d.values().iterator();
+ Iterator iterator = this.dataValues.valueCollection().iterator(); // Spigot
while (iterator.hasNext()) {
DataWatcher.WatchableObject datawatcher_watchableobject = (DataWatcher.WatchableObject) iterator.next();
@@ -163,7 +168,7 @@ public class DataWatcher {
public void a(PacketDataSerializer packetdataserializer) throws IOException {
this.f.readLock().lock();
- Iterator iterator = this.d.values().iterator();
+ Iterator iterator = this.dataValues.valueCollection().iterator(); // Spigot
while (iterator.hasNext()) {
DataWatcher.WatchableObject datawatcher_watchableobject = (DataWatcher.WatchableObject) iterator.next();
@@ -176,18 +181,11 @@ public class DataWatcher {
}
public List<DataWatcher.WatchableObject> c() {
- ArrayList arraylist = null;
+ ArrayList arraylist = Lists.newArrayList(); // Spigot
this.f.readLock().lock();
- DataWatcher.WatchableObject datawatcher_watchableobject;
-
- for (Iterator iterator = this.d.values().iterator(); iterator.hasNext(); arraylist.add(datawatcher_watchableobject)) {
- datawatcher_watchableobject = (DataWatcher.WatchableObject) iterator.next();
- if (arraylist == null) {
- arraylist = Lists.newArrayList();
- }
- }
+ arraylist.addAll(this.dataValues.valueCollection()); // Spigot
this.f.readLock().unlock();
return arraylist;
@@ -310,14 +308,16 @@ public class DataWatcher {
}
static {
- DataWatcher.c.put(Byte.class, Integer.valueOf(0));
- DataWatcher.c.put(Short.class, Integer.valueOf(1));
- DataWatcher.c.put(Integer.class, Integer.valueOf(2));
- DataWatcher.c.put(Float.class, Integer.valueOf(3));
- DataWatcher.c.put(String.class, Integer.valueOf(4));
- DataWatcher.c.put(ItemStack.class, Integer.valueOf(5));
- DataWatcher.c.put(BlockPosition.class, Integer.valueOf(6));
- DataWatcher.c.put(Vector3f.class, Integer.valueOf(7));
+ // Spigot Start - remove valueOf
+ classToId.put(Byte.class, 0);
+ classToId.put(Short.class, 1);
+ classToId.put(Integer.class, 2);
+ classToId.put(Float.class, 3);
+ classToId.put(String.class, 4);
+ classToId.put(ItemStack.class, 5);
+ classToId.put(BlockPosition.class, 6);
+ classToId.put(Vector3f.class, 7);
+ // Spigot End
}
public static class WatchableObject {
--
2.1.4