aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkstvr32 <109012629+kstvr32@users.noreply.github.com>2024-09-14 08:31:55 -0400
committerGitHub <noreply@github.com>2024-09-14 14:31:55 +0200
commit21a087fba239ca87e01eaa8df62e00cc26a201c2 (patch)
treee1644d1e1882be8b8683475c74d79ec95645ed41
parentdce066c6e3dc5fc07d575aac82160f366e3e1df3 (diff)
downloadGT5-Unofficial-21a087fba239ca87e01eaa8df62e00cc26a201c2.tar.gz
GT5-Unofficial-21a087fba239ca87e01eaa8df62e00cc26a201c2.tar.bz2
GT5-Unofficial-21a087fba239ca87e01eaa8df62e00cc26a201c2.zip
Optimize GTUtility.getTier call (#3165)
Co-authored-by: kstvr32 <kstvr32@gmail.com> Co-authored-by: Martin Robertz <dream-master@gmx.net>
-rw-r--r--src/main/java/gregtech/api/util/GTUtility.java12
-rw-r--r--src/test/java/gregtech/api/util/GTUtilityTest.java24
2 files changed, 33 insertions, 3 deletions
diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java
index 8eeb71753e..ede680ba62 100644
--- a/src/main/java/gregtech/api/util/GTUtility.java
+++ b/src/main/java/gregtech/api/util/GTUtility.java
@@ -500,9 +500,15 @@ public class GTUtility {
}
public static byte getTier(long l) {
- byte i = -1;
- while (++i < V.length) if (l <= V[i]) return i;
- return (byte) (V.length - 1);
+ if (l > V[14]) return 15;
+ if (l <= V[0]) return 0;
+
+ // numberOfLeadingZeros is implemented in hardware by x86 LZCNT
+ // and is extremely efficient (takes only a couple of hardware cycles)
+ // (64 - numberOfLeadingZeros(l - 1)) = ceil(log_2(l))
+ int log2L = 64 - Long.numberOfLeadingZeros(l - 1);
+
+ return (byte) ((log2L - 2) / 2);
}
public static long getAmperageForTier(long voltage, byte tier) {
diff --git a/src/test/java/gregtech/api/util/GTUtilityTest.java b/src/test/java/gregtech/api/util/GTUtilityTest.java
new file mode 100644
index 0000000000..bb6632cd41
--- /dev/null
+++ b/src/test/java/gregtech/api/util/GTUtilityTest.java
@@ -0,0 +1,24 @@
+package gregtech.api.util;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import gregtech.api.enums.GTValues;
+
+public class GTUtilityTest {
+
+ @Test
+ public void testGetTier() {
+ assertEquals(0, GTUtility.getTier(-1));
+ assertEquals(0, GTUtility.getTier(1));
+ assertEquals(0, GTUtility.getTier(GTValues.V[0]));
+ for (int i = 1; i < 16; i++) {
+ assertEquals(
+ i,
+ GTUtility.getTier(GTValues.V[i - 1] + 1),
+ String.format("%d, %d", i, GTValues.V[i - 1] + 1));
+ assertEquals(i, GTUtility.getTier(GTValues.V[i]));
+ }
+ }
+}