[cleanup] Preallocate memory in CollectionUtils + cache the collection sizes for iteration Bug: 282215580 Test: build + boot + perf record Change-Id: I1c7b205395e92989d3584554d77ed8140d967651
diff --git a/core/java/com/android/internal/util/CollectionUtils.java b/core/java/com/android/internal/util/CollectionUtils.java index b87027c..4191936 100644 --- a/core/java/com/android/internal/util/CollectionUtils.java +++ b/core/java/com/android/internal/util/CollectionUtils.java
@@ -120,8 +120,9 @@ public static @NonNull <I, O> List<O> map(@Nullable List<I> cur, Function<? super I, ? extends O> f) { if (isEmpty(cur)) return Collections.emptyList(); - final ArrayList<O> result = new ArrayList<>(); - for (int i = 0; i < cur.size(); i++) { + final int size = cur.size(); + final ArrayList<O> result = new ArrayList<>(size); + for (int i = 0; i < size; i++) { result.add(f.apply(cur.get(i))); } return result; @@ -133,7 +134,7 @@ public static @NonNull <I, O> Set<O> map(@Nullable Set<I> cur, Function<? super I, ? extends O> f) { if (isEmpty(cur)) return emptySet(); - ArraySet<O> result = new ArraySet<>(); + ArraySet<O> result = new ArraySet<>(cur.size()); if (cur instanceof ArraySet) { ArraySet<I> arraySet = (ArraySet<I>) cur; int size = arraySet.size(); @@ -163,7 +164,7 @@ Function<? super I, ? extends O> f) { if (isEmpty(cur)) return Collections.emptyList(); List<O> result = null; - for (int i = 0; i < cur.size(); i++) { + for (int i = 0, size = cur.size(); i < size; i++) { O transformed = f.apply(cur.get(i)); if (transformed != null) { result = add(result, transformed); @@ -239,7 +240,7 @@ public static @NonNull <T> List<T> filter(@Nullable List<?> list, Class<T> c) { if (isEmpty(list)) return Collections.emptyList(); ArrayList<T> result = null; - for (int i = 0; i < list.size(); i++) { + for (int i = 0, size = list.size(); i < size; i++) { final Object item = list.get(i); if (c.isInstance(item)) { result = ArrayUtils.add(result, (T) item); @@ -273,7 +274,7 @@ public static @Nullable <T> T find(@Nullable List<T> items, java.util.function.Predicate<T> predicate) { if (isEmpty(items)) return null; - for (int i = 0; i < items.size(); i++) { + for (int i = 0, size = items.size(); i < size; i++) { final T item = items.get(i); if (predicate.test(item)) return item; }