aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0232-Improve-BlockPosition-inlining.patch
diff options
context:
space:
mode:
authorSpottedleaf <[email protected]>2022-09-01 09:51:59 -0700
committerGitHub <[email protected]>2022-09-01 09:51:59 -0700
commit046466f3ba72d6bdaa0213cde64676dd0024ace0 (patch)
tree717d69c8521cac0e4881c009e636891e116c2378 /patches/server/0232-Improve-BlockPosition-inlining.patch
parenteff22eb0541559f05cf9a8c370d70c3b346f80f6 (diff)
downloadPaper-046466f3ba72d6bdaa0213cde64676dd0024ace0.tar.gz
Paper-046466f3ba72d6bdaa0213cde64676dd0024ace0.zip
Re-arrange most chunk system patches to front (#8338)
* Re-arrange most chunk system patches to front Co-authored-by: Spottedleaf <[email protected]>
Diffstat (limited to 'patches/server/0232-Improve-BlockPosition-inlining.patch')
-rw-r--r--patches/server/0232-Improve-BlockPosition-inlining.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/patches/server/0232-Improve-BlockPosition-inlining.patch b/patches/server/0232-Improve-BlockPosition-inlining.patch
new file mode 100644
index 0000000000..c8ba260207
--- /dev/null
+++ b/patches/server/0232-Improve-BlockPosition-inlining.patch
@@ -0,0 +1,63 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Techcable <[email protected]>
+Date: Wed, 30 Nov 2016 20:56:58 -0600
+Subject: [PATCH] Improve BlockPosition inlining
+
+Normally the JVM can inline virtual getters by having two sets of code, one is the 'optimized' code and the other is the 'deoptimized' code.
+If a single type is used 99% of the time, then its worth it to inline, and to revert to 'deoptimized' the 1% of the time we encounter other types.
+But if two types are encountered commonly, then the JVM can't inline them both, and the call overhead remains.
+
+This scenario also occurs with BlockPos and MutableBlockPos.
+The variables in BlockPos are final, so MutableBlockPos can't modify them.
+MutableBlockPos fixes this by adding custom mutable variables, and overriding the getters to access them.
+
+This approach with utility methods that operate on MutableBlockPos and BlockPos.
+Specific examples are BlockPosition.up(), and World.isValidLocation().
+It makes these simple methods much slower than they need to be.
+
+This should result in an across the board speedup in anything that accesses blocks or does logic with positions.
+
+This is based upon conclusions drawn from inspecting the assenmbly generated bythe JIT compiler on my microbenchmarks.
+They had 'callq' (invoke) instead of 'mov' (get from memory) instructions.
+
+diff --git a/src/main/java/net/minecraft/core/Vec3i.java b/src/main/java/net/minecraft/core/Vec3i.java
+index 9f32861d791f7e4cb39d2ad01f48e1916fc2b4b1..73b3c5f5c037fbe3f588f8f4b0113bef283632a4 100644
+--- a/src/main/java/net/minecraft/core/Vec3i.java
++++ b/src/main/java/net/minecraft/core/Vec3i.java
+@@ -50,7 +50,7 @@ public class Vec3i implements Comparable<Vec3i> {
+ }
+
+ @Override
+- public boolean equals(Object object) {
++ public final boolean equals(Object object) { // Paper
+ if (this == object) {
+ return true;
+ } else if (!(object instanceof Vec3i)) {
+@@ -68,7 +68,7 @@ public class Vec3i implements Comparable<Vec3i> {
+ }
+
+ @Override
+- public int hashCode() {
++ public final int hashCode() { // Paper
+ return (this.getY() + this.getZ() * 31) * 31 + this.getX();
+ }
+
+@@ -81,15 +81,15 @@ public class Vec3i implements Comparable<Vec3i> {
+ }
+ }
+
+- public int getX() {
++ public final int getX() { // Paper
+ return this.x;
+ }
+
+- public int getY() {
++ public final int getY() { // Paper
+ return this.y;
+ }
+
+- public int getZ() {
++ public final int getZ() { // Paper
+ return this.z;
+ }
+