From 6bedcc2c7a314f06a431021649b450a5cce2ab07 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sat, 3 Mar 2018 19:25:11 -0700 Subject: [PATCH 1/2] Reuse NumberFormatter to reduce allocations --- .../BlastFurnaceCofferOverlay.java | 4 +++- .../client/plugins/hiscore/HiscorePanel.java | 20 +++++++++---------- .../client/plugins/xptracker/XpPanel.java | 5 +++-- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java index 0c6db7ee0f..6846060ff1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java @@ -39,6 +39,8 @@ import net.runelite.client.ui.overlay.components.PanelComponent; class BlastFurnaceCofferOverlay extends Overlay { + private static final NumberFormat NUMBER_FORMATTER = NumberFormat.getInstance(); + private final Client client; private final BlastFurnacePlugin plugin; private final PanelComponent panelComponent = new PanelComponent(); @@ -69,7 +71,7 @@ class BlastFurnaceCofferOverlay extends Overlay panelComponent.getLines().add(new PanelComponent.Line( "Coffer:", - NumberFormat.getInstance().format(client.getSetting(BLAST_FURNACE_COFFER)) + " gp" + NUMBER_FORMATTER.format(client.getSetting(BLAST_FURNACE_COFFER)) + " gp" )); } return panelComponent.render(graphics, parent); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java index 27c270a360..29f9692bb9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -68,6 +68,8 @@ public class HiscorePanel extends PluginPanel private static final String SKILL_NAME = "SKILL_NAME"; private static final String SKILL = "SKILL"; + private static final NumberFormat NUMBER_FORMATTER = NumberFormat.getInstance(); + private static final HiscoreSkill[] SKILL_PANEL_ORDER = new HiscoreSkill[] { ATTACK, HITPOINTS, MINING, @@ -255,8 +257,6 @@ public class HiscorePanel extends PluginPanel return; } - NumberFormat formatter = NumberFormat.getInstance(); - String text; switch (skillName) { @@ -272,8 +272,8 @@ public class HiscorePanel extends PluginPanel result.getPrayer().getLevel() ); text = "Skill: Combat" + System.lineSeparator() - + "Exact Combat Level: " + formatter.format(combatLevel) + System.lineSeparator() - + "Experience: " + formatter.format(result.getAttack().getExperience() + + "Exact Combat Level: " + NUMBER_FORMATTER.format(combatLevel) + System.lineSeparator() + + "Experience: " + NUMBER_FORMATTER.format(result.getAttack().getExperience() + result.getStrength().getExperience() + result.getDefence().getExperience() + result.getHitpoints().getExperience() + result.getMagic().getExperience() + result.getRanged().getExperience() + result.getPrayer().getExperience()); @@ -281,28 +281,28 @@ public class HiscorePanel extends PluginPanel } case "Clue Scrolls (all)": { - String rank = (result.getClueScrollAll().getRank() == -1) ? "Unranked" : formatter.format(result.getClueScrollAll().getRank()); + String rank = (result.getClueScrollAll().getRank() == -1) ? "Unranked" : NUMBER_FORMATTER.format(result.getClueScrollAll().getRank()); text = "Total Clue Scrolls Completed" + System.lineSeparator() + "Rank: " + rank; break; } case "Bounty Hunter - Rogue": { - String rank = (result.getBountyHunterRogue().getRank() == -1) ? "Unranked" : formatter.format(result.getBountyHunterRogue().getRank()); + String rank = (result.getBountyHunterRogue().getRank() == -1) ? "Unranked" : NUMBER_FORMATTER.format(result.getBountyHunterRogue().getRank()); text = "Bounty Hunter - Rogue Kills" + System.lineSeparator() + "Rank: " + rank; break; } case "Bounty Hunter - Hunter": { - String rank = (result.getBountyHunterHunter().getRank() == -1) ? "Unranked" : formatter.format(result.getBountyHunterHunter().getRank()); + String rank = (result.getBountyHunterHunter().getRank() == -1) ? "Unranked" : NUMBER_FORMATTER.format(result.getBountyHunterHunter().getRank()); text = "Bounty Hunter - Hunter Kills" + System.lineSeparator() + "Rank: " + rank; break; } case "Last Man Standing": { - String rank = (result.getLastManStanding().getRank() == -1) ? "Unranked" : formatter.format(result.getLastManStanding().getRank()); + String rank = (result.getLastManStanding().getRank() == -1) ? "Unranked" : NUMBER_FORMATTER.format(result.getLastManStanding().getRank()); text = "Last Man Standing" + System.lineSeparator() + "Rank: " + rank; break; @@ -310,8 +310,8 @@ public class HiscorePanel extends PluginPanel default: { Skill requestedSkill = result.getSkill(skill); - String rank = (requestedSkill.getRank() == -1) ? "Unranked" : formatter.format(requestedSkill.getRank()); - String exp = (requestedSkill.getRank() == -1) ? "Unranked" : formatter.format(requestedSkill.getExperience()); + String rank = (requestedSkill.getRank() == -1) ? "Unranked" : NUMBER_FORMATTER.format(requestedSkill.getRank()); + String exp = (requestedSkill.getRank() == -1) ? "Unranked" : NUMBER_FORMATTER.format(requestedSkill.getExperience()); text = "Skill: " + skillName + System.lineSeparator() + "Rank: " + rank + System.lineSeparator() + "Experience: " + exp; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java index 90dd3530a6..86bf6c43a4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java @@ -45,6 +45,8 @@ import net.runelite.client.ui.PluginPanel; @Slf4j class XpPanel extends PluginPanel { + private static final NumberFormat NUMBER_FORMATTER = NumberFormat.getInstance(); + private final Map infoBoxes = new HashMap<>(); private final JLabel totalXpGained = new JLabel(); private final JLabel totalXpHr = new JLabel(); @@ -139,7 +141,6 @@ class XpPanel extends PluginPanel static String formatLine(double number, String description) { - - return NumberFormat.getInstance().format(number) + " " + description; + return NUMBER_FORMATTER.format(number) + " " + description; } } From 2e80d972febf6facf3e7c36a8d2a8c50a859282f Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sat, 3 Mar 2018 19:57:09 -0700 Subject: [PATCH 2/2] inline RSHashTableMixin.getNodes into RSWidgetMixin.getParentId to reduce allocations --- .../net/runelite/mixins/RSHashTableMixin.java | 1 + .../net/runelite/mixins/RSWidgetMixin.java | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSHashTableMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSHashTableMixin.java index 25426d526f..ae82420438 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSHashTableMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSHashTableMixin.java @@ -40,6 +40,7 @@ public abstract class RSHashTableMixin implements RSHashTable @Override public Collection getNodes() { + // Copied in RSWidgetMixin.getParentId to reduce allocations List nodes = new ArrayList(); RSNode[] buckets = getBuckets(); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java index 6de2421011..07954d9f16 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java @@ -43,6 +43,7 @@ import net.runelite.api.widgets.WidgetItem; import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSHashTable; +import net.runelite.rs.api.RSNode; import net.runelite.rs.api.RSWidget; @Mixin(RSWidget.class) @@ -76,18 +77,27 @@ public abstract class RSWidgetMixin implements RSWidget return parentId; } - int i = TO_GROUP(getId()); + int groupId = TO_GROUP(getId()); RSHashTable componentTable = client.getComponentTable(); - for (Node node : componentTable.getNodes()) + RSNode[] buckets = componentTable.getBuckets(); + for (int i = 0; i < buckets.length; ++i) { - WidgetNode wn = (WidgetNode) node; + Node node = buckets[i]; - if (i == wn.getId()) + // It looks like the first node in the bucket is always + // a sentinel + Node cur = node.getNext(); + while (cur != node) { - return (int) wn.getHash(); + WidgetNode wn = (WidgetNode) cur; + + if (groupId == wn.getId()) + { + return (int) wn.getHash(); + } + cur = cur.getNext(); } } - return -1; }