From 71f50ead81fbb0d744a76b2e3202b2871e0b3718 Mon Sep 17 00:00:00 2001 From: md_5 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, Integer> c = Maps.newHashMap(); - private final Map 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, Integer> c = gnu.trove.TDecorators.wrap( classToId ); + private final Map d = gnu.trove.TDecorators.wrap( dataValues ); + // Spigot End private boolean e; private ReadWriteLock f = new ReentrantReadWriteLock(); @@ -25,19 +30,19 @@ public class DataWatcher { } public 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 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.0