aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/removed/1.19.2-legacy-chunksystem/0393-Optimise-ArraySetSorted-removeIf.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/removed/1.19.2-legacy-chunksystem/0393-Optimise-ArraySetSorted-removeIf.patch')
-rw-r--r--patches/removed/1.19.2-legacy-chunksystem/0393-Optimise-ArraySetSorted-removeIf.patch88
1 files changed, 88 insertions, 0 deletions
diff --git a/patches/removed/1.19.2-legacy-chunksystem/0393-Optimise-ArraySetSorted-removeIf.patch b/patches/removed/1.19.2-legacy-chunksystem/0393-Optimise-ArraySetSorted-removeIf.patch
new file mode 100644
index 0000000000..eed4ea8bc2
--- /dev/null
+++ b/patches/removed/1.19.2-legacy-chunksystem/0393-Optimise-ArraySetSorted-removeIf.patch
@@ -0,0 +1,88 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Wed, 15 Apr 2020 18:23:28 -0700
+Subject: [PATCH] Optimise ArraySetSorted#removeIf
+
+Remove iterator allocation and ensure the call is always O(n)
+
+diff --git a/src/main/java/net/minecraft/server/level/DistanceManager.java b/src/main/java/net/minecraft/server/level/DistanceManager.java
+index 9309ea89a440606be3e56ef634f5048a72b0009e..1d1ea158d095bb69260929e8d84f2632a875c136 100644
+--- a/src/main/java/net/minecraft/server/level/DistanceManager.java
++++ b/src/main/java/net/minecraft/server/level/DistanceManager.java
+@@ -86,13 +86,27 @@ public abstract class DistanceManager {
+ protected void purgeStaleTickets() {
+ ++this.ticketTickCounter;
+ ObjectIterator objectiterator = this.tickets.long2ObjectEntrySet().fastIterator();
++ // Paper start - use optimised removeIf
++ long[] currChunk = new long[1];
++ long ticketCounter = DistanceManager.this.ticketTickCounter;
++ java.util.function.Predicate<Ticket<?>> removeIf = (ticket) -> {
++ final boolean ret = ticket.timedOut(ticketCounter);
++ if (ret) {
++ this.tickingTicketsTracker.removeTicket(currChunk[0], ticket);
++ }
++ return ret;
++ };
++ // Paper end - use optimised removeIf
+
+ while (objectiterator.hasNext()) {
+ Entry<SortedArraySet<Ticket<?>>> entry = (Entry) objectiterator.next();
+- Iterator<Ticket<?>> iterator = ((SortedArraySet) entry.getValue()).iterator();
+- boolean flag = false;
++ // Paper start - use optimised removeIf
++ Iterator<Ticket<?>> iterator = null;
++ currChunk[0] = entry.getLongKey();
++ boolean flag = entry.getValue().removeIf(removeIf);
+
+- while (iterator.hasNext()) {
++ while (false && iterator.hasNext()) {
++ // Paper end - use optimised removeIf
+ Ticket<?> ticket = (Ticket) iterator.next();
+
+ if (ticket.timedOut(this.ticketTickCounter)) {
+diff --git a/src/main/java/net/minecraft/util/SortedArraySet.java b/src/main/java/net/minecraft/util/SortedArraySet.java
+index d1b2ba24ef54e01c6249c3b2ca16e80f03c001a6..5f1c4c6b9e36f2d6ec43b82cc0e2cae24b800dc4 100644
+--- a/src/main/java/net/minecraft/util/SortedArraySet.java
++++ b/src/main/java/net/minecraft/util/SortedArraySet.java
+@@ -22,6 +22,41 @@ public class SortedArraySet<T> extends AbstractSet<T> {
+ this.contents = (T[])castRawArray(new Object[initialCapacity]);
+ }
+ }
++ // Paper start - optimise removeIf
++ @Override
++ public boolean removeIf(java.util.function.Predicate<? super T> filter) {
++ // prev. impl used an iterator, which could be n^2 and creates garbage
++ int i = 0, len = this.size;
++ T[] backingArray = this.contents;
++
++ for (;;) {
++ if (i >= len) {
++ return false;
++ }
++ if (!filter.test(backingArray[i])) {
++ ++i;
++ continue;
++ }
++ break;
++ }
++
++ // we only want to write back to backingArray if we really need to
++
++ int lastIndex = i; // this is where new elements are shifted to
++
++ for (; i < len; ++i) {
++ T curr = backingArray[i];
++ if (!filter.test(curr)) { // if test throws we're screwed
++ backingArray[lastIndex++] = curr;
++ }
++ }
++
++ // cleanup end
++ Arrays.fill(backingArray, lastIndex, len, null);
++ this.size = lastIndex;
++ return true;
++ }
++ // Paper end - optimise removeIf
+
+ public static <T extends Comparable<T>> SortedArraySet<T> create() {
+ return create(10);