From 1def4d8dd01ad67f472db739eb8b2d917c54b5f6 Mon Sep 17 00:00:00 2001 From: Aikar Date: Thu, 27 Aug 2015 01:15:02 -0400 Subject: [PATCH] Optimize Chunk Access getting a loaded chunk is one of the most hottest pieces of code in the game. getChunkAt is called for the same chunk multiple times in a row, often from getType(); Optimize this look up by using a Last Access cache. diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java index b0a82e7ed..a7e8a3f7d 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java @@ -27,7 +27,27 @@ public class ChunkProviderServer implements IChunkProvider { public final Set unloadQueue = Sets.newHashSet(); public final ChunkGenerator chunkGenerator; private final IChunkLoader chunkLoader; - public final Long2ObjectMap chunks = new Long2ObjectOpenHashMap(8192); + // Paper start + protected Chunk lastChunkByPos = null; + public Long2ObjectOpenHashMap chunks = new Long2ObjectOpenHashMap(8192) { + + @Override + public Chunk get(long key) { + if (lastChunkByPos != null && key == lastChunkByPos.chunkKey) { + return lastChunkByPos; + } + return lastChunkByPos = super.get(key); + } + + @Override + public Chunk remove(long key) { + if (lastChunkByPos != null && key == lastChunkByPos.chunkKey) { + lastChunkByPos = null; + } + return super.remove(key); + } + }; // CraftBukkit + // Paper end public final WorldServer world; public ChunkProviderServer(WorldServer worldserver, IChunkLoader ichunkloader, ChunkGenerator chunkgenerator) { -- 2.12.0.windows.1