From 7fa7e43c2908420d9e67558ebcccdf57c78433f3 Mon Sep 17 00:00:00 2001 From: yueh Date: Tue, 30 Sep 2014 22:59:49 +0200 Subject: [PATCH] Some performance or memory optimizations Replaced String concat in loops with StringBuilder (performance) Replaced for with keySet + Map.get() through for with entrySet (perf) Changed inner classes to static classes, mostly struct like (memory) --- .../client/gui/widgets/GuiImgButton.java | 4 +-- .../client/render/RenderBlocksWorkaround.java | 2 +- .../ContainerInterfaceTerminal.java | 4 +-- src/main/java/appeng/core/api/ApiPart.java | 2 +- .../features/registries/WorldGenRegistry.java | 2 +- .../java/appeng/crafting/CraftingJob.java | 8 ++--- .../java/appeng/helpers/PatternHelper.java | 2 +- .../java/appeng/hooks/CompassManager.java | 2 +- .../java/appeng/hooks/MeteoriteWorldGen.java | 2 +- src/main/java/appeng/hooks/TickHandler.java | 2 +- .../items/materials/ItemMultiMaterial.java | 2 +- .../appeng/items/parts/ItemMultiPart.java | 2 +- src/main/java/appeng/me/Grid.java | 7 ++-- src/main/java/appeng/me/NetworkEventBus.java | 11 ++++--- .../appeng/me/cache/CraftingGridCache.java | 2 +- .../implementations/CraftingCPUCluster.java | 2 +- .../me/storage/MEMonitorIInventory.java | 2 +- .../appeng/recipes/game/ShapedRecipe.java | 27 ++++++++-------- .../appeng/recipes/game/ShapelessRecipe.java | 11 ++++--- .../java/appeng/recipes/handlers/Shaped.java | 8 ++--- .../appeng/recipes/handlers/Shapeless.java | 32 ++++++++++--------- .../java/appeng/services/VersionChecker.java | 6 ++-- .../java/appeng/spatial/StorageHelper.java | 18 +++++------ .../util/inv/WrapperChainedInventory.java | 2 +- src/main/java/appeng/util/item/OreHelper.java | 4 +-- 25 files changed, 86 insertions(+), 80 deletions(-) diff --git a/src/main/java/appeng/client/gui/widgets/GuiImgButton.java b/src/main/java/appeng/client/gui/widgets/GuiImgButton.java index 94c5a3be5..a0e918b6c 100644 --- a/src/main/java/appeng/client/gui/widgets/GuiImgButton.java +++ b/src/main/java/appeng/client/gui/widgets/GuiImgButton.java @@ -33,7 +33,7 @@ import appeng.core.localization.ButtonToolTips; public class GuiImgButton extends GuiButton implements ITooltip { - class EnumPair + static class EnumPair { final Enum setting; @@ -63,7 +63,7 @@ public class GuiImgButton extends GuiButton implements ITooltip } - class BtnAppearance + static class BtnAppearance { public int index; diff --git a/src/main/java/appeng/client/render/RenderBlocksWorkaround.java b/src/main/java/appeng/client/render/RenderBlocksWorkaround.java index e7b7b0eb0..a2a177ef4 100644 --- a/src/main/java/appeng/client/render/RenderBlocksWorkaround.java +++ b/src/main/java/appeng/client/render/RenderBlocksWorkaround.java @@ -23,7 +23,7 @@ public class RenderBlocksWorkaround extends RenderBlocks public EnumSet renderFaces = EnumSet.allOf( ForgeDirection.class ); public EnumSet faces = EnumSet.allOf( ForgeDirection.class ); - private class LightingCache implements ISimplifiedBundle + private static class LightingCache implements ISimplifiedBundle { public IIcon rXPos; diff --git a/src/main/java/appeng/container/implementations/ContainerInterfaceTerminal.java b/src/main/java/appeng/container/implementations/ContainerInterfaceTerminal.java index aca8be2b4..8a3f37370 100644 --- a/src/main/java/appeng/container/implementations/ContainerInterfaceTerminal.java +++ b/src/main/java/appeng/container/implementations/ContainerInterfaceTerminal.java @@ -42,7 +42,7 @@ public class ContainerInterfaceTerminal extends AEBaseContainer static private long autoBase = Long.MIN_VALUE; - class InvTracker + static class InvTracker { final long which = autoBase++; @@ -76,7 +76,7 @@ public class ContainerInterfaceTerminal extends AEBaseContainer NBTTagCompound data = new NBTTagCompound(); - class PatternInvSlot extends WrapperInvSlot + static class PatternInvSlot extends WrapperInvSlot { public PatternInvSlot(IInventory inv) { diff --git a/src/main/java/appeng/core/api/ApiPart.java b/src/main/java/appeng/core/api/ApiPart.java index 565fc68b6..356212f8b 100644 --- a/src/main/java/appeng/core/api/ApiPart.java +++ b/src/main/java/appeng/core/api/ApiPart.java @@ -196,7 +196,7 @@ public class ApiPart implements IPartHelper } } - class DefaultPackageClassNameRemapper extends Remapper + static class DefaultPackageClassNameRemapper extends Remapper { public final HashMap inputOutput = new HashMap(); diff --git a/src/main/java/appeng/core/features/registries/WorldGenRegistry.java b/src/main/java/appeng/core/features/registries/WorldGenRegistry.java index 1b61c7b33..a30afb28e 100644 --- a/src/main/java/appeng/core/features/registries/WorldGenRegistry.java +++ b/src/main/java/appeng/core/features/registries/WorldGenRegistry.java @@ -9,7 +9,7 @@ import appeng.api.features.IWorldGen; public class WorldGenRegistry implements IWorldGen { - private class TypeSet + private static class TypeSet { final HashSet> badProviders = new HashSet>(); diff --git a/src/main/java/appeng/crafting/CraftingJob.java b/src/main/java/appeng/crafting/CraftingJob.java index 2fd093759..168026bda 100644 --- a/src/main/java/appeng/crafting/CraftingJob.java +++ b/src/main/java/appeng/crafting/CraftingJob.java @@ -124,14 +124,14 @@ public class CraftingJob implements Runnable, ICraftingJob missing.add( what ); } - class twoIntegers + static class TwoIntegers { public final long perOp = 0; public final long times = 0; } - final HashMap opsAndMultiplier = new HashMap(); + final HashMap opsAndMultiplier = new HashMap(); @Override public void run() @@ -154,7 +154,7 @@ public class CraftingJob implements Runnable, ICraftingJob for (String s : opsAndMultiplier.keySet()) { - twoIntegers ti = opsAndMultiplier.get( s ); + TwoIntegers ti = opsAndMultiplier.get( s ); AELog.crafting( s + " * " + ti.times + " = " + (ti.perOp * ti.times) ); } @@ -180,7 +180,7 @@ public class CraftingJob implements Runnable, ICraftingJob for (String s : opsAndMultiplier.keySet()) { - twoIntegers ti = opsAndMultiplier.get( s ); + TwoIntegers ti = opsAndMultiplier.get( s ); AELog.crafting( s + " * " + ti.times + " = " + (ti.perOp * ti.times) ); } diff --git a/src/main/java/appeng/helpers/PatternHelper.java b/src/main/java/appeng/helpers/PatternHelper.java index 6ce218270..ea2f84659 100644 --- a/src/main/java/appeng/helpers/PatternHelper.java +++ b/src/main/java/appeng/helpers/PatternHelper.java @@ -41,7 +41,7 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable tiles = new LinkedList(); diff --git a/src/main/java/appeng/items/materials/ItemMultiMaterial.java b/src/main/java/appeng/items/materials/ItemMultiMaterial.java index 1c083b68e..a08970d5d 100644 --- a/src/main/java/appeng/items/materials/ItemMultiMaterial.java +++ b/src/main/java/appeng/items/materials/ItemMultiMaterial.java @@ -60,7 +60,7 @@ public class ItemMultiMaterial extends AEBaseItem implements IStorageComponent, instance = this; } - class SlightlyBetterSort implements Comparator + static class SlightlyBetterSort implements Comparator { final Pattern p; diff --git a/src/main/java/appeng/items/parts/ItemMultiPart.java b/src/main/java/appeng/items/parts/ItemMultiPart.java index 1ff55527e..33538a0b3 100644 --- a/src/main/java/appeng/items/parts/ItemMultiPart.java +++ b/src/main/java/appeng/items/parts/ItemMultiPart.java @@ -33,7 +33,7 @@ import cpw.mods.fml.relauncher.SideOnly; public class ItemMultiPart extends AEBaseItem implements IPartItem, IItemGroup { - class PartTypeIst + static class PartTypeIst { PartType part; diff --git a/src/main/java/appeng/me/Grid.java b/src/main/java/appeng/me/Grid.java index 4736a8edc..9c6750b07 100644 --- a/src/main/java/appeng/me/Grid.java +++ b/src/main/java/appeng/me/Grid.java @@ -3,6 +3,7 @@ package appeng.me; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; +import java.util.Map.Entry; import java.util.Set; import appeng.api.AEApi; @@ -34,10 +35,10 @@ public class Grid implements IGrid this.pivot = center; HashMap, IGridCache> myCaches = AEApi.instance().registries().gridCache().createCacheInstance( this ); - for (Class c : myCaches.keySet()) + for (Entry, IGridCache> c : myCaches.entrySet()) { - bus.readClass( c, myCaches.get( c ).getClass() ); - caches.put( c, new GridCacheWrapper( myCaches.get( c ) ) ); + bus.readClass( c.getKey(), c.getValue().getClass() ); + caches.put( c.getKey(), new GridCacheWrapper( c.getValue() ) ); } postEvent( new MENetworkPostCacheConstruction() ); diff --git a/src/main/java/appeng/me/NetworkEventBus.java b/src/main/java/appeng/me/NetworkEventBus.java index c76fe51b8..0b6eb6e86 100644 --- a/src/main/java/appeng/me/NetworkEventBus.java +++ b/src/main/java/appeng/me/NetworkEventBus.java @@ -4,6 +4,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; +import java.util.Map.Entry; import java.util.Set; import appeng.api.networking.IGridNode; @@ -14,7 +15,7 @@ import appeng.core.AELog; public class NetworkEventBus { - class NetworkEventDone extends Throwable + static class NetworkEventDone extends Throwable { private static final long serialVersionUID = -3079021487019171205L; @@ -129,17 +130,17 @@ public class NetworkEventBus { if ( subscribers != null ) { - for (Class o : subscribers.keySet()) + for (Entry subscriber : subscribers.entrySet()) { - MENetworkEventInfo target = subscribers.get( o ); - GridCacheWrapper cache = g.caches.get( o ); + MENetworkEventInfo target = subscriber.getValue(); + GridCacheWrapper cache = g.caches.get( subscriber.getKey() ); if ( cache != null ) { x++; target.invoke( cache.myCache, e ); } - for (IGridNode obj : g.getMachines( o )) + for (IGridNode obj : g.getMachines( subscriber.getKey() )) { x++; target.invoke( obj.getMachine(), e ); diff --git a/src/main/java/appeng/me/cache/CraftingGridCache.java b/src/main/java/appeng/me/cache/CraftingGridCache.java index f1941ba98..27eef4e1c 100644 --- a/src/main/java/appeng/me/cache/CraftingGridCache.java +++ b/src/main/java/appeng/me/cache/CraftingGridCache.java @@ -86,7 +86,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper final private SetMultimap interests = HashMultimap.create(); final public GenericInterestManager interestManager = new GenericInterestManager( interests ); - class ActiveCpuIterator implements Iterator + static class ActiveCpuIterator implements Iterator { final Iterator i; diff --git a/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java b/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java index 24a1da9d5..8ac7a60f5 100644 --- a/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java +++ b/src/main/java/appeng/me/cluster/implementations/CraftingCPUCluster.java @@ -58,7 +58,7 @@ import cpw.mods.fml.common.FMLCommonHandler; public class CraftingCPUCluster implements IAECluster, ICraftingCPU { - class TaskProgress + static class TaskProgress { long value; diff --git a/src/main/java/appeng/me/storage/MEMonitorIInventory.java b/src/main/java/appeng/me/storage/MEMonitorIInventory.java index c30179b3a..2be8949fd 100644 --- a/src/main/java/appeng/me/storage/MEMonitorIInventory.java +++ b/src/main/java/appeng/me/storage/MEMonitorIInventory.java @@ -27,7 +27,7 @@ import appeng.util.inv.ItemSlot; public class MEMonitorIInventory implements IMEInventory, IMEMonitor { - class CachedItemStack + static class CachedItemStack { public CachedItemStack(ItemStack is) diff --git a/src/main/java/appeng/recipes/game/ShapedRecipe.java b/src/main/java/appeng/recipes/game/ShapedRecipe.java index ed2c16315..ac6984829 100644 --- a/src/main/java/appeng/recipes/game/ShapedRecipe.java +++ b/src/main/java/appeng/recipes/game/ShapedRecipe.java @@ -31,10 +31,11 @@ public class ShapedRecipe implements IRecipe, IRecipeBakeable return !disable; } - public ShapedRecipe(ItemStack result, Object... recipe) { + public ShapedRecipe(ItemStack result, Object... recipe) + { output = result.copy(); - String shape = ""; + StringBuilder shape = new StringBuilder(); int idx = 0; if ( recipe[idx] instanceof Boolean ) @@ -57,7 +58,7 @@ public class ShapedRecipe implements IRecipe, IRecipeBakeable for (String s : parts) { width = s.length(); - shape += s; + shape.append( s ); } height = parts.length; @@ -67,7 +68,7 @@ public class ShapedRecipe implements IRecipe, IRecipeBakeable while (recipe[idx] instanceof String) { String s = (String) recipe[idx++]; - shape += s; + shape.append( s ); width = s.length(); height++; } @@ -75,13 +76,13 @@ public class ShapedRecipe implements IRecipe, IRecipeBakeable if ( width * height != shape.length() ) { - String ret = "Invalid shaped ore recipe: "; + StringBuilder ret = new StringBuilder( "Invalid shaped ore recipe: " ); for (Object tmp : recipe) { - ret += tmp + ", "; + ret.append( tmp + ", " ); } - ret += output; - throw new RuntimeException( ret ); + ret.append( output ); + throw new RuntimeException( ret.toString() ); } HashMap itemMap = new HashMap(); @@ -97,19 +98,19 @@ public class ShapedRecipe implements IRecipe, IRecipeBakeable } else { - String ret = "Invalid shaped ore recipe: "; + StringBuilder ret = new StringBuilder( "Invalid shaped ore recipe: " ); for (Object tmp : recipe) { - ret += tmp + ", "; + ret.append( tmp + ", " ); } - ret += output; - throw new RuntimeException( ret ); + ret.append( output ); + throw new RuntimeException( ret.toString() ); } } input = new Object[width * height]; int x = 0; - for (char chr : shape.toCharArray()) + for (char chr : shape.toString().toCharArray()) { input[x++] = itemMap.get( chr ); } diff --git a/src/main/java/appeng/recipes/game/ShapelessRecipe.java b/src/main/java/appeng/recipes/game/ShapelessRecipe.java index b1099712f..e7bec0131 100644 --- a/src/main/java/appeng/recipes/game/ShapelessRecipe.java +++ b/src/main/java/appeng/recipes/game/ShapelessRecipe.java @@ -24,7 +24,8 @@ public class ShapelessRecipe implements IRecipe, IRecipeBakeable return !disable; } - public ShapelessRecipe(ItemStack result, Object... recipe) { + public ShapelessRecipe(ItemStack result, Object... recipe) + { output = result.copy(); for (Object in : recipe) { @@ -34,13 +35,13 @@ public class ShapelessRecipe implements IRecipe, IRecipeBakeable } else { - String ret = "Invalid shapeless ore recipe: "; + StringBuilder ret = new StringBuilder( "Invalid shapeless ore recipe: " ); for (Object tmp : recipe) { - ret += tmp + ", "; + ret.append( tmp + ", " ); } - ret += output; - throw new RuntimeException( ret ); + ret.append( output ); + throw new RuntimeException( ret.toString() ); } } } diff --git a/src/main/java/appeng/recipes/handlers/Shaped.java b/src/main/java/appeng/recipes/handlers/Shaped.java index 9cbd8828d..8f199d1bf 100644 --- a/src/main/java/appeng/recipes/handlers/Shaped.java +++ b/src/main/java/appeng/recipes/handlers/Shaped.java @@ -64,21 +64,21 @@ public class Shaped implements ICraftHandler, IWebsiteSerializer for (int y = 0; y < rows; y++) { - String row = ""; + StringBuilder row = new StringBuilder(); for (int x = 0; x < cols; x++) { if ( inputs.get( y ).get( x ).isAir() ) - row = row + " "; + row.append( " " ); else { - row = row + first; + row.append( first ); args.add( first ); args.add( inputs.get( y ).get( x ) ); first++; } } - args.add( y, row ); + args.add( y, row.toString() ); } ItemStack outIS = output.getItemStack(); diff --git a/src/main/java/appeng/recipes/handlers/Shapeless.java b/src/main/java/appeng/recipes/handlers/Shapeless.java index 4e3eea58e..5c0b6f523 100644 --- a/src/main/java/appeng/recipes/handlers/Shapeless.java +++ b/src/main/java/appeng/recipes/handlers/Shapeless.java @@ -57,9 +57,10 @@ public class Shapeless implements ICraftHandler, IWebsiteSerializer throw new RegistrationError( "Error while adding shapeless recipe." ); } } - + @Override - public boolean canCraft(ItemStack reqOutput) throws RegistrationError, MissingIngredientError { + public boolean canCraft(ItemStack reqOutput) throws RegistrationError, MissingIngredientError + { for (IIngredient i : inputs) { @@ -74,26 +75,27 @@ public class Shapeless implements ICraftHandler, IWebsiteSerializer } } } - - return Platform.isSameItemPrecise( output.getItemStack(),reqOutput ); + + return Platform.isSameItemPrecise( output.getItemStack(), reqOutput ); } @Override - public String getPattern( RecipeHandler h) { - String o = "shapeless "+output.getQty()+"\n"; + public String getPattern(RecipeHandler h) + { + StringBuilder o = new StringBuilder( "shapeless " + output.getQty() + "\n" ); - o += h.getName(output)+"\n"; - - for ( int y = 0; y < inputs.size(); y++ ) + o.append( h.getName( output ) + "\n" ); + + for (int y = 0; y < inputs.size(); y++) { - IIngredient i = inputs.get(y); + IIngredient i = inputs.get( y ); if ( i.isAir() ) - o += "air"+( y +1 == inputs.size() ? "\n" : " " ); + o.append( "air" + (y + 1 == inputs.size() ? "\n" : " ") ); else - o += h.getName(i)+( y +1 == inputs.size() ? "\n" : " " ); + o.append( h.getName( i ) + (y + 1 == inputs.size() ? "\n" : " ") ); } - - return o.trim(); + + return o.toString().trim(); } - + } diff --git a/src/main/java/appeng/services/VersionChecker.java b/src/main/java/appeng/services/VersionChecker.java index 9329685d2..63744de24 100644 --- a/src/main/java/appeng/services/VersionChecker.java +++ b/src/main/java/appeng/services/VersionChecker.java @@ -60,17 +60,17 @@ public class VersionChecker implements Runnable yc.setRequestProperty( "User-Agent", "AE2/" + AEConfig.VERSION + " (Channel:" + AEConfig.CHANNEL + "," + MCVersion.replace( " ", ":" ) + ")" ); BufferedReader in = new BufferedReader( new InputStreamReader( yc.getInputStream() ) ); - String Version = ""; + StringBuilder Version = new StringBuilder(); String inputLine; while ((inputLine = in.readLine()) != null) - Version += inputLine; + Version.append( inputLine ); in.close(); if ( Version.length() > 2 ) { - JsonElement element = (new JsonParser()).parse( Version ); + JsonElement element = (new JsonParser()).parse( Version.toString() ); int version = element.getAsJsonObject().get( "FormatVersion" ).getAsInt(); if ( version == 1 ) diff --git a/src/main/java/appeng/spatial/StorageHelper.java b/src/main/java/appeng/spatial/StorageHelper.java index 17baeb603..e66683304 100644 --- a/src/main/java/appeng/spatial/StorageHelper.java +++ b/src/main/java/appeng/spatial/StorageHelper.java @@ -31,12 +31,12 @@ public class StorageHelper return instance; } - class triggerUpdates implements ISpatialVisitor + static class TriggerUpdates implements ISpatialVisitor { final World dst; - public triggerUpdates(World dst2) { + public TriggerUpdates(World dst2) { dst = dst2; } @@ -48,7 +48,7 @@ public class StorageHelper } } - class WrapInMatrixFrame implements ISpatialVisitor + static class WrapInMatrixFrame implements ISpatialVisitor { final World dst; @@ -68,7 +68,7 @@ public class StorageHelper } } - class TelDestination + static class TelDestination { TelDestination(World _dim, AxisAlignedBB srcBox, double _x, double _y, double _z, int tileX, int tileY, int tileZ) { @@ -91,7 +91,7 @@ public class StorageHelper final int zOff; } - class METeleporter extends Teleporter + static class METeleporter extends Teleporter { final TelDestination dest; @@ -303,11 +303,11 @@ public class StorageHelper for (WorldCoord wc : cSrc.updates) cSrc.world.notifyBlockOfNeighborChange( wc.x, wc.y, wc.z, Platform.air ); - transverseEdges( x - 1, y - 1, z - 1, x + scaleX + 1, y + scaleY + 1, z + scaleZ + 1, new triggerUpdates( src ) ); - transverseEdges( i - 1, j - 1, k - 1, i + scaleX + 1, j + scaleY + 1, k + scaleZ + 1, new triggerUpdates( dst ) ); + transverseEdges( x - 1, y - 1, z - 1, x + scaleX + 1, y + scaleY + 1, z + scaleZ + 1, new TriggerUpdates( src ) ); + transverseEdges( i - 1, j - 1, k - 1, i + scaleX + 1, j + scaleY + 1, k + scaleZ + 1, new TriggerUpdates( dst ) ); - transverseEdges( x, y, z, x + scaleX, y + scaleY, z + scaleZ, new triggerUpdates( src ) ); - transverseEdges( i, j, k, i + scaleX, j + scaleY, k + scaleZ, new triggerUpdates( dst ) ); + transverseEdges( x, y, z, x + scaleX, y + scaleY, z + scaleZ, new TriggerUpdates( src ) ); + transverseEdges( i, j, k, i + scaleX, j + scaleY, k + scaleZ, new TriggerUpdates( dst ) ); /* * IChunkProvider cp = dest.getChunkProvider(); if ( cp instanceof ChunkProviderServer ) { ChunkProviderServer diff --git a/src/main/java/appeng/util/inv/WrapperChainedInventory.java b/src/main/java/appeng/util/inv/WrapperChainedInventory.java index 7acc256f2..b6cd86be0 100644 --- a/src/main/java/appeng/util/inv/WrapperChainedInventory.java +++ b/src/main/java/appeng/util/inv/WrapperChainedInventory.java @@ -13,7 +13,7 @@ import net.minecraft.item.ItemStack; public class WrapperChainedInventory implements IInventory { - class InvOffset + static class InvOffset { int offset; diff --git a/src/main/java/appeng/util/item/OreHelper.java b/src/main/java/appeng/util/item/OreHelper.java index 5d486adf6..5ebe49d57 100644 --- a/src/main/java/appeng/util/item/OreHelper.java +++ b/src/main/java/appeng/util/item/OreHelper.java @@ -13,7 +13,7 @@ public class OreHelper public static final OreHelper instance = new OreHelper(); - class ItemRef + static class ItemRef { ItemRef(ItemStack stack) @@ -51,7 +51,7 @@ public class OreHelper } - class OreResult + static class OreResult { public OreReference oreValue = null;