Improve AESharedItemStack caching

Reduces the item stack churn a little, improving overall server time taken from 6% to 2% on average
This commit is contained in:
NotMyWing
2024-06-09 13:33:33 +11:00
parent f7562db2e9
commit 724f3baf4c
@@ -23,14 +23,16 @@
package appeng.util.item; package appeng.util.item;
import com.google.common.collect.MapMaker;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.lang.ref.WeakReference; import java.util.Map;
import java.util.WeakHashMap;
public final class AEItemStackRegistry { public final class AEItemStackRegistry {
private static final WeakHashMap<AESharedItemStack, WeakReference<AESharedItemStack>> REGISTRY = new WeakHashMap<>();
private static final ItemStackHashStrategy HASH_STRATEGY = ItemStackHashStrategy.comparingAllButCount();
private static final Map<Integer, AESharedItemStack> REGISTRY = new MapMaker().weakValues().makeMap();
private AEItemStackRegistry() { private AEItemStackRegistry() {
} }
@@ -40,23 +42,18 @@ public final class AEItemStackRegistry {
throw new IllegalArgumentException("stack cannot be empty"); throw new IllegalArgumentException("stack cannot be empty");
} }
int oldStackSize = itemStack.getCount(); var hash = HASH_STRATEGY.hashCode(itemStack);
itemStack.setCount(1); var ret = REGISTRY.get(hash);
if (ret != null) {
AESharedItemStack search = new AESharedItemStack(itemStack); return ret;
WeakReference<AESharedItemStack> weak = REGISTRY.get(search);
AESharedItemStack ret = null;
if (weak != null) {
ret = weak.get();
} }
if (ret == null) { // computeIfAbsent is not feasible since new AESharedItemStack gets
ret = new AESharedItemStack(itemStack.copy()); // instantly GC'd when leaving the lambda.
REGISTRY.put(ret, new WeakReference<>(ret)); var itemStackCopy = itemStack.copy();
} itemStackCopy.setCount(1);
itemStack.setCount(oldStackSize); var sharedStack = new AESharedItemStack(itemStackCopy);
REGISTRY.put(hash, sharedStack);
return ret; return sharedStack;
} }
} }