Loading apct-tests/perftests/core/src/android/util/ArrayMapPerfTest.java 0 → 100644 +72 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.util; import android.perftests.utils.BenchmarkState; import android.perftests.utils.PerfStatusReporter; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import java.util.function.BiConsumer; @RunWith(AndroidJUnit4.class) @LargeTest public class ArrayMapPerfTest { private static final int NUM_ITERATIONS = 100; private static final int SET_SIZE_SMALL = 10; private static final int SET_SIZE_LARGE = 50; @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); @Test public void testForEach_Small() { BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); BiConsumer<String, Integer> consumer = (s, i) -> { }; while (state.keepRunning()) { for (int i = 0; i < NUM_ITERATIONS; ++i) { ArrayMap<String, Integer> map = new ArrayMap<>(); for (int j = 0; j < SET_SIZE_SMALL; j++) { map.put(Integer.toString(j), j); } map.forEach(consumer); } } } @Test public void testForEach_Large() { BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); BiConsumer<String, Integer> consumer = (s, i) -> { }; while (state.keepRunning()) { for (int i = 0; i < NUM_ITERATIONS; ++i) { ArrayMap<String, Integer> map = new ArrayMap<>(); for (int j = 0; j < SET_SIZE_LARGE; j++) { map.put(Integer.toString(j), j); } map.forEach(consumer); } } } } core/java/android/util/ArrayMap.java +23 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; /** * ArrayMap is a generic key->value mapping data structure that is Loading Loading @@ -979,6 +980,28 @@ public final class ArrayMap<K, V> implements Map<K, V> { return MapCollections.containsAllHelper(this, collection); } /** * Performs the given action for all elements in the stored order. This implementation overrides * the default implementation to avoid iterating using the {@link #entrySet()} and iterates in * the key-value order consistent with {@link #keyAt(int)} and {@link #valueAt(int)}. * * @param action The action to be performed for each element */ @Override public void forEach(BiConsumer<? super K, ? super V> action) { if (action == null) { throw new NullPointerException("action must not be null"); } final int size = mSize; for (int i = 0; i < size; ++i) { if (size != mSize) { throw new ConcurrentModificationException(); } action.accept(keyAt(i), valueAt(i)); } } /** * Perform a {@link #put(Object, Object)} of all key/value pairs in <var>map</var> * @param map The map whose contents are to be retrieved. Loading Loading
apct-tests/perftests/core/src/android/util/ArrayMapPerfTest.java 0 → 100644 +72 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.util; import android.perftests.utils.BenchmarkState; import android.perftests.utils.PerfStatusReporter; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import java.util.function.BiConsumer; @RunWith(AndroidJUnit4.class) @LargeTest public class ArrayMapPerfTest { private static final int NUM_ITERATIONS = 100; private static final int SET_SIZE_SMALL = 10; private static final int SET_SIZE_LARGE = 50; @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); @Test public void testForEach_Small() { BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); BiConsumer<String, Integer> consumer = (s, i) -> { }; while (state.keepRunning()) { for (int i = 0; i < NUM_ITERATIONS; ++i) { ArrayMap<String, Integer> map = new ArrayMap<>(); for (int j = 0; j < SET_SIZE_SMALL; j++) { map.put(Integer.toString(j), j); } map.forEach(consumer); } } } @Test public void testForEach_Large() { BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); BiConsumer<String, Integer> consumer = (s, i) -> { }; while (state.keepRunning()) { for (int i = 0; i < NUM_ITERATIONS; ++i) { ArrayMap<String, Integer> map = new ArrayMap<>(); for (int j = 0; j < SET_SIZE_LARGE; j++) { map.put(Integer.toString(j), j); } map.forEach(consumer); } } } }
core/java/android/util/ArrayMap.java +23 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; /** * ArrayMap is a generic key->value mapping data structure that is Loading Loading @@ -979,6 +980,28 @@ public final class ArrayMap<K, V> implements Map<K, V> { return MapCollections.containsAllHelper(this, collection); } /** * Performs the given action for all elements in the stored order. This implementation overrides * the default implementation to avoid iterating using the {@link #entrySet()} and iterates in * the key-value order consistent with {@link #keyAt(int)} and {@link #valueAt(int)}. * * @param action The action to be performed for each element */ @Override public void forEach(BiConsumer<? super K, ? super V> action) { if (action == null) { throw new NullPointerException("action must not be null"); } final int size = mSize; for (int i = 0; i < size; ++i) { if (size != mSize) { throw new ConcurrentModificationException(); } action.accept(keyAt(i), valueAt(i)); } } /** * Perform a {@link #put(Object, Object)} of all key/value pairs in <var>map</var> * @param map The map whose contents are to be retrieved. Loading