From cdd926c1e9fc882a1a5c179f3f7a8ee3e1d7766b Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 5 Apr 2016 20:43:11 -0400 Subject: [PATCH] Re-add fastutil map to Chunk map. Amaranth confirmed its faster by 3x --- ...FastUtil-Int-HashMap-for-DataWatcher.patch | 33 ----------- .../0121-Use-Optimized-Collections.patch | 57 +++++++++++++++++++ 2 files changed, 57 insertions(+), 33 deletions(-) delete mode 100644 Spigot-Server-Patches/0121-Use-FastUtil-Int-HashMap-for-DataWatcher.patch create mode 100644 Spigot-Server-Patches/0121-Use-Optimized-Collections.patch diff --git a/Spigot-Server-Patches/0121-Use-FastUtil-Int-HashMap-for-DataWatcher.patch b/Spigot-Server-Patches/0121-Use-FastUtil-Int-HashMap-for-DataWatcher.patch deleted file mode 100644 index 2087b1f26c..0000000000 --- a/Spigot-Server-Patches/0121-Use-FastUtil-Int-HashMap-for-DataWatcher.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 005dac3ad5e821f19272ed003a8b4df9aac6e56f Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Wed, 30 Mar 2016 02:13:24 -0400 -Subject: [PATCH] Use FastUtil Int HashMap for DataWatcher - -For DataWatcher, swap out plain Integer key HashMap for a Int2ObjectOpenHashMap - -These collections are super fast as seen -http://java-performance.info/hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove-january-2015/ - -diff --git a/src/main/java/net/minecraft/server/DataWatcher.java b/src/main/java/net/minecraft/server/DataWatcher.java -index f1c62ec..68a0565 100644 ---- a/src/main/java/net/minecraft/server/DataWatcher.java -+++ b/src/main/java/net/minecraft/server/DataWatcher.java -@@ -11,13 +11,14 @@ import java.util.List; - import java.util.Map; - import java.util.concurrent.locks.ReadWriteLock; - import java.util.concurrent.locks.ReentrantReadWriteLock; -+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; // Paper - import org.apache.commons.lang3.ObjectUtils; - - public class DataWatcher { - - private static final Map, Integer> a = Maps.newHashMap(); - private final Entity b; -- private final Map> c = Maps.newHashMap(); -+ private final Map> c = new Int2ObjectOpenHashMap<>(); // Paper - private final ReadWriteLock d = new ReentrantReadWriteLock(); - private boolean e = true; - private boolean f; --- -2.8.0 - diff --git a/Spigot-Server-Patches/0121-Use-Optimized-Collections.patch b/Spigot-Server-Patches/0121-Use-Optimized-Collections.patch new file mode 100644 index 0000000000..a3bca4ede9 --- /dev/null +++ b/Spigot-Server-Patches/0121-Use-Optimized-Collections.patch @@ -0,0 +1,57 @@ +From d07ba0d59c2b9be2696a4828c94fa060bca16a4d Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Wed, 30 Mar 2016 02:13:24 -0400 +Subject: [PATCH] Use Optimized Collections For DataWatcher, swap out plain + Integer key HashMap for a Int2ObjectOpenHashMap For ChunkProviderServer, swap + out CraftBukkit LongObjectHashMap with Long2ObjectOpenHashMap + +Amaranth, the creator of LongObjectHashMap, tested it vs fastutil and determined fastutil to be 3x faster +and could not create anything faster than fastutil. + +These collections are super fast as seen +http://java-performance.info/hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove-january-2015/ + +diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java +index 3a1ee86..d112216 100644 +--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java ++++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java +@@ -5,6 +5,7 @@ import java.util.Iterator; + import java.util.List; + + import com.destroystokyo.paper.exception.ServerInternalException; ++import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + +@@ -26,7 +27,7 @@ public class ChunkProviderServer implements IChunkProvider { + private final IChunkLoader chunkLoader; + // Paper start + protected Chunk lastChunkByPos = null; +- public LongObjectHashMap chunks = new LongObjectHashMap() { ++ public Long2ObjectOpenHashMap chunks = new Long2ObjectOpenHashMap() { + @Override + public Chunk get(long key) { + if (lastChunkByPos != null && key == lastChunkByPos.chunkKey) { +diff --git a/src/main/java/net/minecraft/server/DataWatcher.java b/src/main/java/net/minecraft/server/DataWatcher.java +index f1c62ec..68a0565 100644 +--- a/src/main/java/net/minecraft/server/DataWatcher.java ++++ b/src/main/java/net/minecraft/server/DataWatcher.java +@@ -11,13 +11,14 @@ import java.util.List; + import java.util.Map; + import java.util.concurrent.locks.ReadWriteLock; + import java.util.concurrent.locks.ReentrantReadWriteLock; ++import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; // Paper + import org.apache.commons.lang3.ObjectUtils; + + public class DataWatcher { + + private static final Map, Integer> a = Maps.newHashMap(); + private final Entity b; +- private final Map> c = Maps.newHashMap(); ++ private final Map> c = new Int2ObjectOpenHashMap<>(); // Paper + private final ReadWriteLock d = new ReentrantReadWriteLock(); + private boolean e = true; + private boolean f; +-- +2.8.0 +