Skip to content

Commit

Permalink
Switch some fast util usages from hash to array implementations when …
Browse files Browse the repository at this point in the history
…we know we will be dealing with small number of elements
  • Loading branch information
pupnewfster committed Nov 5, 2021
1 parent 7994249 commit cf91117
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 29 deletions.
8 changes: 5 additions & 3 deletions src/api/java/mekanism/api/chemical/ChemicalType.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package mekanism.api.chemical;

import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
import java.util.Map;
import java.util.function.Predicate;
import javax.annotation.Nonnull;
Expand All @@ -26,10 +26,12 @@ public enum ChemicalType implements IStringSerializable {
PIGMENT("pigment", c -> c instanceof Pigment),
SLURRY("slurry", c -> c instanceof Slurry);

private static final Map<String, ChemicalType> nameToType = new Object2ObjectOpenHashMap<>();
private static final Map<String, ChemicalType> nameToType;

static {
for (ChemicalType type : values()) {
ChemicalType[] values = values();
nameToType = new Object2ObjectArrayMap<>(values.length);
for (ChemicalType type : values) {
nameToType.put(type.getSerializedName(), type);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import it.unimi.dsi.fastutil.chars.Char2ObjectLinkedOpenHashMap;
import it.unimi.dsi.fastutil.chars.Char2ObjectArrayMap;
import it.unimi.dsi.fastutil.chars.Char2ObjectMap;
import it.unimi.dsi.fastutil.chars.CharOpenHashSet;
import it.unimi.dsi.fastutil.chars.CharSet;
Expand All @@ -23,7 +23,7 @@
@MethodsReturnNonnullByDefault
public class ExtendedShapedRecipeBuilder extends BaseRecipeBuilder<ExtendedShapedRecipeBuilder> {

private final Char2ObjectMap<Ingredient> key = new Char2ObjectLinkedOpenHashMap<>();
private final Char2ObjectMap<Ingredient> key = new Char2ObjectArrayMap<>(9);
private final List<String> pattern = new ArrayList<>();

protected ExtendedShapedRecipeBuilder(IRecipeSerializer<?> serializer, IItemProvider result, int count) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/mekanism/client/ClientTickHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
Expand Down Expand Up @@ -73,7 +73,7 @@ public class ClientTickHandler {

public static final Minecraft minecraft = Minecraft.getInstance();
public static final Random rand = new Random();
public static final Map<PlayerEntity, TeleportData> portableTeleports = new Object2ObjectOpenHashMap<>();
public static final Map<PlayerEntity, TeleportData> portableTeleports = new Object2ObjectArrayMap<>(1);
public boolean initHoliday = false;
public boolean shouldReset = false;
public static boolean firstTick = true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@

public class GuiEnergyTab extends GuiBiDirectionalTab {

private static final Map<EnergyType, ResourceLocation> ICONS = new EnumMap<>(EnergyType.class);
private final IInfoHandler infoHandler;
private final Map<EnergyType, ResourceLocation> icons = new EnumMap<>(EnergyType.class);

public GuiEnergyTab(IGuiWrapper gui, IInfoHandler handler) {
super(MekanismUtils.getResource(ResourceType.GUI_TAB, "energy_info.png"), gui, -26, 137, 26, 26);
Expand Down Expand Up @@ -71,7 +71,7 @@ public void renderToolTip(@Nonnull MatrixStack matrix, int mouseX, int mouseY) {

@Override
protected ResourceLocation getResource() {
return icons.computeIfAbsent(MekanismConfig.general.energyUnit.get(), type -> MekanismUtils.getResource(ResourceType.GUI_TAB,
return ICONS.computeIfAbsent(MekanismConfig.general.energyUnit.get(), type -> MekanismUtils.getResource(ResourceType.GUI_TAB,
"energy_info_" + type.name().toLowerCase(Locale.ROOT) + ".png"));
}

Expand Down
6 changes: 3 additions & 3 deletions src/main/java/mekanism/client/gui/element/tab/GuiHeatTab.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package mekanism.client.gui.element.tab;

import com.mojang.blaze3d.matrix.MatrixStack;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
Expand All @@ -18,8 +18,8 @@

public class GuiHeatTab extends GuiBiDirectionalTab {

private static final Map<TempType, ResourceLocation> ICONS = new EnumMap<>(TempType.class);
private final IInfoHandler infoHandler;
private final Map<TempType, ResourceLocation> icons = new Object2ObjectOpenHashMap<>();

public GuiHeatTab(IGuiWrapper gui, IInfoHandler handler) {
super(MekanismUtils.getResource(ResourceType.GUI_TAB, "heat_info.png"), gui, -26, 109, 26, 26);
Expand All @@ -43,7 +43,7 @@ public void renderToolTip(@Nonnull MatrixStack matrix, int mouseX, int mouseY) {

@Override
protected ResourceLocation getResource() {
return icons.computeIfAbsent(MekanismConfig.general.tempUnit.get(), type -> MekanismUtils.getResource(ResourceType.GUI_TAB,
return ICONS.computeIfAbsent(MekanismConfig.general.tempUnit.get(), type -> MekanismUtils.getResource(ResourceType.GUI_TAB,
"heat_info_" + type.name().toLowerCase(Locale.ROOT) + ".png"));
}

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/mekanism/common/base/HolidayManager.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package mekanism.common.base;

import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import it.unimi.dsi.fastutil.objects.ObjectArraySet;
import java.util.Calendar;
import java.util.Set;
import mekanism.api.math.MathUtils;
Expand All @@ -18,7 +18,7 @@ public final class HolidayManager {

private static final Calendar calendar = Calendar.getInstance();

private static final Set<Holiday> holidays = new ObjectOpenHashSet<>();
private static final Set<Holiday> holidays = new ObjectArraySet<>();

public static final Holiday CHRISTMAS = register(new Christmas());
public static final Holiday NEW_YEAR = register(new NewYear());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package mekanism.common.content.qio;

import com.google.common.collect.Sets;
import it.unimi.dsi.fastutil.chars.Char2ObjectArrayMap;
import it.unimi.dsi.fastutil.chars.Char2ObjectMap;
import it.unimi.dsi.fastutil.chars.Char2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.chars.CharSet;
import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -170,10 +170,12 @@ public enum QueryType {
.anyMatch(tooltip -> tooltip.contains(key.toLowerCase(Locale.ROOT)))),
TAG('#', (key, stack) -> TagCache.getItemTags(stack).stream().anyMatch(itemTag -> itemTag.toLowerCase(Locale.ROOT).contains(key.toLowerCase(Locale.ROOT))));

private static final Char2ObjectMap<QueryType> charLookupMap = new Char2ObjectOpenHashMap<>();
private static final Char2ObjectMap<QueryType> charLookupMap;

static {
for (QueryType type : QueryType.values()) {
QueryType[] values = values();
charLookupMap = new Char2ObjectArrayMap<>(values.length);
for (QueryType type : values) {
charLookupMap.put(type.prefix, type);
}
}
Expand Down
23 changes: 11 additions & 12 deletions src/main/java/mekanism/common/tile/TileEntityTeleporter.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package mekanism.common.tile;

import it.unimi.dsi.fastutil.longs.Long2ObjectArrayMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
Expand All @@ -12,6 +11,7 @@
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import mekanism.api.Action;
Expand Down Expand Up @@ -191,15 +191,11 @@ private Coord4D getClosest() {
}

private void cleanTeleportCache() {
List<UUID> list = new ArrayList<>();
for (Entity e : level.getEntitiesOfClass(Entity.class, teleportBounds)) {
list.add(e.getUUID());
}
Set<UUID> teleportCopy = new ObjectOpenHashSet<>(didTeleport);
for (UUID id : teleportCopy) {
if (!list.contains(id)) {
didTeleport.remove(id);
}
List<UUID> inTeleporter = level.getEntitiesOfClass(Entity.class, teleportBounds).stream().map(Entity::getUUID).collect(Collectors.toList());
if (inTeleporter.isEmpty()) {
didTeleport.clear();
} else {
didTeleport.removeIf(id -> !inTeleporter.contains(id));
}
}

Expand Down Expand Up @@ -494,7 +490,10 @@ private boolean hasFrame(Direction direction, boolean rotated) {
int yComponent = direction.getStepY();
int zComponent = direction.getStepZ();
//Cache the chunks we are looking up to check the frames of
Long2ObjectMap<IChunk> chunkMap = new Long2ObjectOpenHashMap<>();
// Note: We can use an array based map, because we check suck a small area, that if we do go across chunks
// we will be in at most two in general due to the size of our teleporter. But given we need to check multiple
// directions we might end up checking two different cross chunk directions which would end up at three
Long2ObjectMap<IChunk> chunkMap = new Long2ObjectArrayMap<>(3);
return isFramePair(chunkMap, 0, alternatingX, 0, alternatingY, 0, alternatingZ) &&
isFramePair(chunkMap, xComponent, alternatingX, yComponent, alternatingY, zComponent, alternatingZ) &&
isFramePair(chunkMap, 2 * xComponent, alternatingX, 2 * yComponent, alternatingY, 2 * zComponent, alternatingZ) &&
Expand Down

0 comments on commit cf91117

Please sign in to comment.