From d3bf2271fc3aa6ae3113476d9818222ab098e8dd Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 26 Apr 2023 20:56:03 -0400 Subject: [PATCH] Avoid recreating tag ID strings --- .../core/config/ModernFixEarlyConfig.java | 1 + .../perf/tag_id_caching/TagEntryMixin.java | 30 +++++++++++++++++++ .../TagOrElementLocationMixin.java | 29 ++++++++++++++++++ src/main/resources/modernfix.mixins.json | 2 ++ 4 files changed, 62 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagEntryMixin.java create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 630d1f82..44fc0865 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -65,6 +65,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.scan_cache", true); this.addMixinRule("perf.kubejs", modPresent("kubejs")); this.addMixinRule("perf.flatten_model_predicates", true); + this.addMixinRule("perf.tag_id_caching", true); this.addMixinRule("perf.deduplicate_location", false); this.addMixinRule("perf.cache_blockstate_cache_arrays", true); this.addMixinRule("perf.cache_model_materials", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagEntryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagEntryMixin.java new file mode 100644 index 00000000..2827fdb0 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagEntryMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.mixin.perf.tag_id_caching; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagEntry; +import net.minecraft.util.ExtraCodecs; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(TagEntry.class) +public class TagEntryMixin { + @Shadow @Final private boolean tag; + @Shadow @Final private ResourceLocation id; + private ExtraCodecs.TagOrElementLocation cachedLoc; + + /** + * @author embeddedt + * @reason use cached location, overwrite rather than inject to avoid allocs + */ + @Overwrite + private ExtraCodecs.TagOrElementLocation elementOrTag() { + ExtraCodecs.TagOrElementLocation loc = cachedLoc; + if(loc == null) { + loc = new ExtraCodecs.TagOrElementLocation(this.id, this.tag); + cachedLoc = loc; + } + return loc; + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java new file mode 100644 index 00000000..6e4c0b06 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java @@ -0,0 +1,29 @@ +package org.embeddedt.modernfix.mixin.perf.tag_id_caching; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.ExtraCodecs; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ExtraCodecs.TagOrElementLocation.class) +public class TagOrElementLocationMixin { + @Shadow @Final private boolean tag; + @Shadow @Final private ResourceLocation id; + private String cachedDecoratedId; + + /** + * @author embeddedt + * @reason use cached ID, overwrite rather than inject to avoid allocs + */ + @Overwrite + private String decoratedId() { + String id = cachedDecoratedId; + if(id == null) { + id = this.tag ? "#" + this.id : this.id.toString(); + cachedDecoratedId = id; + } + return id; + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 41a48386..d0cd4ebf 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -33,6 +33,8 @@ "perf.nbt_memory_usage.CompoundTagMixin", "perf.fast_registry_validation.ForgeRegistryMixin", "perf.kubejs.RecipeEventJSMixin", + "perf.tag_id_caching.TagEntryMixin", + "perf.tag_id_caching.TagOrElementLocationMixin", "perf.cache_strongholds.ChunkGeneratorMixin", "perf.cache_upgraded_structures.StructureManagerMixin", "perf.cache_strongholds.ServerLevelMixin",