From f000c4064344d10aea96a50f13d9b89bd9df9c0b Mon Sep 17 00:00:00 2001 From: snowleo Date: Wed, 8 May 2013 12:10:34 +1000 Subject: [PATCH] Optimized version of LocaleLanguage This patch reduces the memory footprint of each EntityPlayer by about 300 KB. The original class looks very unfinished and future versions might use the commented code. --- ...-Optimized-version-of-LocaleLanguage.patch | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 CraftBukkit-Patches/0040-Optimized-version-of-LocaleLanguage.patch diff --git a/CraftBukkit-Patches/0040-Optimized-version-of-LocaleLanguage.patch b/CraftBukkit-Patches/0040-Optimized-version-of-LocaleLanguage.patch new file mode 100644 index 0000000..a1d1848 --- /dev/null +++ b/CraftBukkit-Patches/0040-Optimized-version-of-LocaleLanguage.patch @@ -0,0 +1,173 @@ +From 8afd877d7c450801ee8bd0f63c87341e6c41a9cf Mon Sep 17 00:00:00 2001 +From: snowleo +Date: Wed, 8 May 2013 12:09:45 +1000 +Subject: [PATCH] Optimized version of LocaleLanguage + +This patch reduces the memory footprint of each EntityPlayer by about 300 KB. The original class looks very unfinished and future versions might use the commented code. + +diff --git a/src/main/java/net/minecraft/server/LocaleLanguage.java b/src/main/java/net/minecraft/server/LocaleLanguage.java +index d88f864..cd165b9 100644 +--- a/src/main/java/net/minecraft/server/LocaleLanguage.java ++++ b/src/main/java/net/minecraft/server/LocaleLanguage.java +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// Spigot start ++import com.google.common.cache.Cache; ++import com.google.common.cache.CacheBuilder; ++import com.google.common.cache.CacheLoader; ++// Spigot end + import java.io.BufferedReader; + import java.io.File; + import java.io.FileReader; +@@ -12,15 +17,22 @@ import java.util.TreeMap; + + public class LocaleLanguage { + ++ // Spigot - cache languages to prevent reloading on each player creation ++ private static Cache languages = CacheBuilder.newBuilder().weakValues().build( ++ new CacheLoader() { ++ public Properties load(String key) { ++ return loadLanguage(key); ++ } ++ }); + private static LocaleLanguage a = new LocaleLanguage("en_US"); +- private Properties b = new Properties(); +- private TreeMap c; +- private TreeMap d = new TreeMap(); ++ private volatile Properties b = new Properties(); // Spigot - volatile ++ private static TreeMap c; // Spigot - static ++ // private TreeMap d = new TreeMap(); // Spigot - Unused map + private String e; +- private boolean f; ++ // private boolean f; // Spigot - removed + + public LocaleLanguage(String s) { +- this.e(); ++ //this.e(); // Spigot: moved up + this.a(s, false); + } + +@@ -28,7 +40,7 @@ public class LocaleLanguage { + return a; + } + +- private void e() { ++ private static void e() { // Spigot - static + TreeMap treemap = new TreeMap(); + + try { +@@ -46,23 +58,25 @@ public class LocaleLanguage { + return; + } + +- this.c = treemap; +- this.c.put("en_US", "English (US)"); ++ c = treemap; // Spigot - this => static ++ c.put("en_US", "English (US)"); // Spigot - this => static + } + + public TreeMap b() { + return this.c; + } + +- private void a(Properties properties, String s) throws IOException { ++ private static void a(Properties properties, String s) throws IOException { // Spigot - static + BufferedReader bufferedreader = null; + ++ /* Spigot - unused map + if (this.d.containsKey(s)) { + bufferedreader = new BufferedReader(new FileReader((File) this.d.get(s))); + } else { ++ */ + bufferedreader = new BufferedReader(new InputStreamReader(LocaleLanguage.class.getResourceAsStream("/lang/" + s + ".lang"), "UTF-8")); +- } +- ++ //} // Spigot: unused map ++ try { // Spigot: close reader + for (String s1 = bufferedreader.readLine(); s1 != null; s1 = bufferedreader.readLine()) { + s1 = s1.trim(); + if (!s1.startsWith("#")) { +@@ -73,22 +87,32 @@ public class LocaleLanguage { + } + } + } ++ } finally { bufferedreader.close(); } // Spigot - close reader + } + + public synchronized void a(String s, boolean flag) { + if (flag || !s.equals(this.e)) { ++ // Spigot start - Move loading code to new static method ++ this.e = s; ++ this.b = languages.getUnchecked(s); ++ } ++ } ++ ++ private static Properties loadLanguage(String s) { ++ // Spigot end + Properties properties = new Properties(); + + try { +- this.a(properties, "en_US"); ++ a(properties, "en_US"); // Spigot - this => static + } catch (IOException ioexception) { + ; + } + +- this.f = false; ++ // this.f = false; // Spigot - removed variable + if (!"en_US".equals(s)) { + try { +- this.a(properties, s); ++ a(properties, s); // Spigot - this => static ++ /* Spigot - f is unused, so unneeded code + Enumeration enumeration = properties.propertyNames(); + + while (enumeration.hasMoreElements() && !this.f) { +@@ -106,22 +130,25 @@ public class LocaleLanguage { + } + } + } ++ */ + } catch (IOException ioexception1) { + ioexception1.printStackTrace(); +- return; ++ //return; // Spigot - moved down + } + } +- ++ return properties; // Spigot - return properties ++ /* Spigot - moved up + this.e = s; + this.b = properties; + } ++ */ + } + +- public synchronized String a(String s) { ++ public String a(String s) { // Spigot - removed synchronized, b is volatile + return this.b.getProperty(s, s); + } + +- public synchronized String a(String s, Object... aobject) { ++ public String a(String s, Object... aobject) { // Spigot - removed synchronized, b is volatile + String s1 = this.b.getProperty(s, s); + + try { +@@ -131,11 +158,11 @@ public class LocaleLanguage { + } + } + +- public synchronized boolean b(String s) { ++ public boolean b(String s) { // Spigot - removed synchronized, b is volatile + return this.b.containsKey(s); + } + +- public synchronized String c(String s) { ++ public String c(String s) { //S pigot - removed synchronized, b is volatile + return this.b.getProperty(s + ".name", ""); + } + } +-- +1.8.2.1 +