Skip to content

Commit

Permalink
Improve AESharedItemStack caching
Browse files Browse the repository at this point in the history
Reduces the item stack churn a little, improving overall server time taken from 6% to 2% on average
  • Loading branch information
NotMyWing committed Jun 9, 2024
1 parent f7562db commit 724f3ba
Showing 1 changed file with 16 additions and 19 deletions.
35 changes: 16 additions & 19 deletions src/main/java/appeng/util/item/AEItemStackRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,16 @@

package appeng.util.item;

import com.google.common.collect.MapMaker;
import net.minecraft.item.ItemStack;

import javax.annotation.Nonnull;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
import java.util.Map;

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() {
}
Expand All @@ -40,23 +42,18 @@ static synchronized AESharedItemStack getRegisteredStack(final @Nonnull ItemStac
throw new IllegalArgumentException("stack cannot be empty");
}

int oldStackSize = itemStack.getCount();
itemStack.setCount(1);

AESharedItemStack search = new AESharedItemStack(itemStack);
WeakReference<AESharedItemStack> weak = REGISTRY.get(search);
AESharedItemStack ret = null;

if (weak != null) {
ret = weak.get();
}

if (ret == null) {
ret = new AESharedItemStack(itemStack.copy());
REGISTRY.put(ret, new WeakReference<>(ret));
var hash = HASH_STRATEGY.hashCode(itemStack);
var ret = REGISTRY.get(hash);
if (ret != null) {
return ret;
}
itemStack.setCount(oldStackSize);

return ret;
// computeIfAbsent is not feasible since new AESharedItemStack gets
// instantly GC'd when leaving the lambda.
var itemStackCopy = itemStack.copy();
itemStackCopy.setCount(1);
var sharedStack = new AESharedItemStack(itemStackCopy);
REGISTRY.put(hash, sharedStack);
return sharedStack;
}
}

0 comments on commit 724f3ba

Please sign in to comment.