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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user