aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches-Unmapped/0444-Optimise-ArraySetSorted-removeIf.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Spigot-Server-Patches-Unmapped/0444-Optimise-ArraySetSorted-removeIf.patch')
-rw-r--r--Spigot-Server-Patches-Unmapped/0444-Optimise-ArraySetSorted-removeIf.patch65
1 files changed, 65 insertions, 0 deletions
diff --git a/Spigot-Server-Patches-Unmapped/0444-Optimise-ArraySetSorted-removeIf.patch b/Spigot-Server-Patches-Unmapped/0444-Optimise-ArraySetSorted-removeIf.patch
new file mode 100644
index 0000000000..1ff7b9b2f9
--- /dev/null
+++ b/Spigot-Server-Patches-Unmapped/0444-Optimise-ArraySetSorted-removeIf.patch
@@ -0,0 +1,65 @@
+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/util/ArraySetSorted.java b/src/main/java/net/minecraft/util/ArraySetSorted.java
+index 427daa94322f47b4eaf881d85a01fed239db549a..936a90272579f78832eff93f2a81d673feb669c1 100644
+--- a/src/main/java/net/minecraft/util/ArraySetSorted.java
++++ b/src/main/java/net/minecraft/util/ArraySetSorted.java
+@@ -10,8 +10,8 @@ import java.util.NoSuchElementException;
+ public class ArraySetSorted<T> extends AbstractSet<T> {
+
+ private final Comparator<T> a;
+- private T[] b;
+- private int c;
++ private T[] b; private final T[] getBackingArray() { return this.b; } // Paper - OBFHELPER
++ private int c; private final int getSize() { return this.c; } private final void setSize(int value) { this.c = value; } // Paper - OBFHELPER
+
+ private ArraySetSorted(int i, Comparator<T> comparator) {
+ this.a = comparator;
+@@ -22,6 +22,42 @@ public class ArraySetSorted<T> extends AbstractSet<T> {
+ }
+ }
+
++ // 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.getSize();
++ T[] backingArray = this.getBackingArray();
++
++ 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.setSize(lastIndex);
++ return true;
++ }
++ // Paper end - optimise removeIf
++
+ public static <T extends Comparable<T>> ArraySetSorted<T> a(int i) {
+ return new ArraySetSorted<>(i, (Comparator)Comparator.naturalOrder()); // Paper - decompile fix
+ }