Re-add fastutil map to Chunk map. Amaranth confirmed its faster by 3x

This commit is contained in:
Aikar 2016-04-05 20:43:11 -04:00
parent 8e68f444f1
commit cdd926c1e9
2 changed files with 57 additions and 33 deletions

View file

@ -1,33 +0,0 @@
From 005dac3ad5e821f19272ed003a8b4df9aac6e56f Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
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<Class<? extends Entity>, Integer> a = Maps.newHashMap();
private final Entity b;
- private final Map<Integer, DataWatcher.Item<?>> c = Maps.newHashMap();
+ private final Map<Integer, DataWatcher.Item<?>> c = new Int2ObjectOpenHashMap<>(); // Paper
private final ReadWriteLock d = new ReentrantReadWriteLock();
private boolean e = true;
private boolean f;
--
2.8.0

View file

@ -0,0 +1,57 @@
From d07ba0d59c2b9be2696a4828c94fa060bca16a4d Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
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<Chunk> chunks = new LongObjectHashMap<Chunk>() {
+ public Long2ObjectOpenHashMap<Chunk> chunks = new Long2ObjectOpenHashMap<Chunk>() {
@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<Class<? extends Entity>, Integer> a = Maps.newHashMap();
private final Entity b;
- private final Map<Integer, DataWatcher.Item<?>> c = Maps.newHashMap();
+ private final Map<Integer, DataWatcher.Item<?>> c = new Int2ObjectOpenHashMap<>(); // Paper
private final ReadWriteLock d = new ReentrantReadWriteLock();
private boolean e = true;
private boolean f;
--
2.8.0