mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-19 23:33:49 +01:00
25d0fbed10
Remove iterator allocation and ensure the call is always O(n)
66 lines
No EOL
2.4 KiB
Diff
66 lines
No EOL
2.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
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/ArraySetSorted.java b/src/main/java/net/minecraft/server/ArraySetSorted.java
|
|
index 85f799a71..7db6b5850 100644
|
|
--- a/src/main/java/net/minecraft/server/ArraySetSorted.java
|
|
+++ b/src/main/java/net/minecraft/server/ArraySetSorted.java
|
|
@@ -0,0 +0,0 @@ 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;
|
|
@@ -0,0 +0,0 @@ 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
|
|
}
|
|
--
|