diff options
| author | Kweku Adams <kwekua@google.com> | 2021-07-19 10:58:59 -0700 |
|---|---|---|
| committer | Kweku Adams <kwekua@google.com> | 2021-07-19 13:10:23 -0700 |
| commit | 14bbb8a744f641c168f49d5747a47855e25c3bce (patch) | |
| tree | 43263e01354177da203667e4045e7c239e6dc66a /core/java/android/util/ArraySet.java | |
| parent | 7efcc4dfc72bb921b9f68ddf2a4917a08a7cad35 (diff) | |
Improve forEach.
The default implementation of Collection.forEach() uses the
iterator(). Switch to straight iterating through the array since the
iterator is an inefficient way to access the array contents.
Benchmark results:
Before:
android.util.ArraySetPerfTest#testForEach_Large:
forEach_Large_median (ns): 398480
forEach_Large_min (ns): 395758
forEach_Large_mean (ns): 400957
forEach_Large_standardDeviation: 5457
android.util.ArraySetPerfTest#testForEach_Small:
forEach_Small_min (ns): 82768
forEach_Small_median (ns): 83884
forEach_Small_standardDeviation: 896
forEach_Small_mean (ns): 83724
After:
android.util.ArraySetPerfTest#testForEach_Large:
forEach_Large_median (ns): 319481
forEach_Large_min (ns): 316166
forEach_Large_mean (ns): 339865
forEach_Large_standardDeviation: 44201
android.util.ArraySetPerfTest#testForEach_Small:
forEach_Small_min (ns): 58736
forEach_Small_median (ns): 60648
forEach_Small_standardDeviation: 1375
forEach_Small_mean (ns): 60622
Bug: 194098491
Test: atest CorePerfTests:ArraySetPerfTest (see results above)
Test: atest CtsUtilTestCases:ArraySetTest
Test: atest FrameworksCoreTests:ArraySetTest
Change-Id: Ib14b96f095203e1f5811132f2a21be0452645f7e
Diffstat (limited to 'core/java/android/util/ArraySet.java')
| -rw-r--r-- | core/java/android/util/ArraySet.java | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/core/java/android/util/ArraySet.java b/core/java/android/util/ArraySet.java index f53548a41177..b5c75b9276b7 100644 --- a/core/java/android/util/ArraySet.java +++ b/core/java/android/util/ArraySet.java @@ -28,6 +28,7 @@ import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Predicate; /** @@ -747,6 +748,23 @@ public final class ArraySet<E> implements Collection<E>, Set<E> { return mSize; } + /** + * Performs the given action for all elements in the stored order. This implementation overrides + * the default implementation to avoid using the {@link #iterator()}. + * + * @param action The action to be performed for each element + */ + @Override + public void forEach(Consumer<? super E> action) { + if (action == null) { + throw new NullPointerException("action must not be null"); + } + + for (int i = 0; i < mSize; ++i) { + action.accept(valueAt(i)); + } + } + @Override public Object[] toArray() { Object[] result = new Object[mSize]; |
