diff options
Diffstat (limited to 'Spigot-Server-Patches-Unmapped/0444-Optimise-ArraySetSorted-removeIf.patch')
-rw-r--r-- | Spigot-Server-Patches-Unmapped/0444-Optimise-ArraySetSorted-removeIf.patch | 65 |
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 + } |