From 9f4b4a2358b11a33d8d323a2c92a551a11e2ab51 Mon Sep 17 00:00:00 2001 From: repo_alt Date: Tue, 8 Sep 2020 00:37:20 +0300 Subject: A simple cache for the furnace recipes, to avoid linear iteration (Should help with https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues/6416) --- src/main/java/gregtech/api/util/GT_ModHandler.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/main/java/gregtech/api') diff --git a/src/main/java/gregtech/api/util/GT_ModHandler.java b/src/main/java/gregtech/api/util/GT_ModHandler.java index e195bf9b02..4f318bb752 100644 --- a/src/main/java/gregtech/api/util/GT_ModHandler.java +++ b/src/main/java/gregtech/api/util/GT_ModHandler.java @@ -122,6 +122,7 @@ public class GT_ModHandler { public static List sSingleNonBlockDamagableRecipeList_warntOutput = new ArrayList(50); public static List sVanillaRecipeList_warntOutput = new ArrayList(50); public static final List sSingleNonBlockDamagableRecipeList_verified = new ArrayList(1000); + private static HashMap smeltingRecipeCache = new LinkedHashMap<>(); static { sNativeRecipeClasses.add(ShapedRecipes.class.getName()); @@ -1566,7 +1567,13 @@ public class GT_ModHandler { */ public static ItemStack getSmeltingOutput(ItemStack aInput, boolean aRemoveInput, ItemStack aOutputSlot) { if (aInput == null || aInput.stackSize < 1) return null; - ItemStack rStack = GT_OreDictUnificator.get(FurnaceRecipes.smelting().getSmeltingResult(aInput)); + GT_ItemStack gtInput = new GT_ItemStack(aInput); + ItemStack rStack = smeltingRecipeCache.get(gtInput); + if (rStack == null) { + rStack = GT_OreDictUnificator.get(FurnaceRecipes.smelting().getSmeltingResult(aInput)); + if (rStack != null) + smeltingRecipeCache.put(gtInput, rStack); + } if (rStack != null && (aOutputSlot == null || (GT_Utility.areStacksEqual(rStack, aOutputSlot) && rStack.stackSize + aOutputSlot.stackSize <= aOutputSlot.getMaxStackSize()))) { if (aRemoveInput) aInput.stackSize--; return rStack; -- cgit From 726e3d0fe46e3ba793f3c3e9b7acc3fd00a752ef Mon Sep 17 00:00:00 2001 From: repo_alt Date: Wed, 9 Sep 2020 08:24:03 +0300 Subject: replace HashMap with a (bounded) Guava Cache --- src/main/java/gregtech/api/util/GT_ModHandler.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'src/main/java/gregtech/api') diff --git a/src/main/java/gregtech/api/util/GT_ModHandler.java b/src/main/java/gregtech/api/util/GT_ModHandler.java index 4f318bb752..4d264bec9b 100644 --- a/src/main/java/gregtech/api/util/GT_ModHandler.java +++ b/src/main/java/gregtech/api/util/GT_ModHandler.java @@ -1,5 +1,7 @@ package gregtech.api.util; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.registry.GameRegistry; import gregtech.GT_Mod; @@ -122,7 +124,7 @@ public class GT_ModHandler { public static List sSingleNonBlockDamagableRecipeList_warntOutput = new ArrayList(50); public static List sVanillaRecipeList_warntOutput = new ArrayList(50); public static final List sSingleNonBlockDamagableRecipeList_verified = new ArrayList(1000); - private static HashMap smeltingRecipeCache = new LinkedHashMap<>(); + private static Cache sSmeltingRecipeCache = CacheBuilder.newBuilder().maximumSize(1000).build(); static { sNativeRecipeClasses.add(ShapedRecipes.class.getName()); @@ -1566,14 +1568,14 @@ public class GT_ModHandler { * Used in my own Furnace. */ public static ItemStack getSmeltingOutput(ItemStack aInput, boolean aRemoveInput, ItemStack aOutputSlot) { - if (aInput == null || aInput.stackSize < 1) return null; - GT_ItemStack gtInput = new GT_ItemStack(aInput); - ItemStack rStack = smeltingRecipeCache.get(gtInput); - if (rStack == null) { - rStack = GT_OreDictUnificator.get(FurnaceRecipes.smelting().getSmeltingResult(aInput)); - if (rStack != null) - smeltingRecipeCache.put(gtInput, rStack); + if (aInput == null || aInput.stackSize < 1) + return null; + ItemStack rStack = null; + try { + rStack = sSmeltingRecipeCache.get(new GT_ItemStack(aInput), () -> GT_OreDictUnificator.get(FurnaceRecipes.smelting().getSmeltingResult(aInput))); + } catch (Exception ignored){ } + if (rStack != null && (aOutputSlot == null || (GT_Utility.areStacksEqual(rStack, aOutputSlot) && rStack.stackSize + aOutputSlot.stackSize <= aOutputSlot.getMaxStackSize()))) { if (aRemoveInput) aInput.stackSize--; return rStack; -- cgit