From 2030cb404183e5146fba290ad556270420d51dde Mon Sep 17 00:00:00 2001 From: Miguel Date: Mon, 25 Apr 2022 08:49:16 +0000 Subject: Even more libcore benchmark tests. Test: atest TestName Change-Id: I547d8347dade1f66164acbfbacd2936fa0664b95 --- .../regression/AnnotatedElementPerfTest.java | 331 +++++++++++++ .../android/libcore/regression/BidiPerfTest.java | 128 +++++ .../libcore/regression/BigIntegerPerfTest.java | 69 +++ .../android/libcore/regression/BitSetPerfTest.java | 115 +++++ .../libcore/regression/BreakIteratorPerfTest.java | 193 ++++++++ .../libcore/regression/ByteBufferBulkPerfTest.java | 139 ++++++ .../libcore/regression/ByteBufferPerfTest.java | 532 +++++++++++++++++++++ .../ByteBufferScalarVersusVectorPerfTest.java | 149 ++++++ .../libcore/regression/CharacterPerfTest.java | 359 ++++++++++++++ .../libcore/regression/CharsetForNamePerfTest.java | 63 +++ .../libcore/regression/CharsetPerfTest.java | 146 ++++++ .../libcore/regression/CharsetUtf8PerfTest.java | 82 ++++ .../libcore/regression/ChecksumPerfTest.java | 74 +++ .../regression/CipherInputStreamPerfTest.java | 92 ++++ .../android/libcore/regression/CipherPerfTest.java | 210 ++++++++ .../libcore/regression/CollatorPerfTest.java | 84 ++++ .../libcore/regression/CollectionsPerfTest.java | 107 +++++ 17 files changed, 2873 insertions(+) create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/AnnotatedElementPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/BidiPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/BigIntegerPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/BitSetPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/BreakIteratorPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/ByteBufferBulkPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/ByteBufferPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/ByteBufferScalarVersusVectorPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/CharacterPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/CharsetForNamePerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/CharsetPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/CharsetUtf8PerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/ChecksumPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/CipherInputStreamPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/CipherPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/CollatorPerfTest.java create mode 100644 apct-tests/perftests/core/src/android/libcore/regression/CollectionsPerfTest.java diff --git a/apct-tests/perftests/core/src/android/libcore/regression/AnnotatedElementPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/AnnotatedElementPerfTest.java new file mode 100644 index 000000000000..d38d5197b937 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/AnnotatedElementPerfTest.java @@ -0,0 +1,331 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class AnnotatedElementPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + private Class mType; + private Field mField; + private Method mMethod; + + @Before + public void setUp() throws Exception { + mType = Type.class; + mField = Type.class.getField("field"); + mMethod = Type.class.getMethod("method", String.class); + } + + // get annotations by member type and method + + @Test + public void timeGetTypeAnnotations() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mType.getAnnotations(); + } + } + + @Test + public void timeGetFieldAnnotations() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mField.getAnnotations(); + } + } + + @Test + public void timeGetMethodAnnotations() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mMethod.getAnnotations(); + } + } + + @Test + public void timeGetParameterAnnotations() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mMethod.getParameterAnnotations(); + } + } + + @Test + public void timeGetTypeAnnotation() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mType.getAnnotation(Marker.class); + } + } + + @Test + public void timeGetFieldAnnotation() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mField.getAnnotation(Marker.class); + } + } + + @Test + public void timeGetMethodAnnotation() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mMethod.getAnnotation(Marker.class); + } + } + + @Test + public void timeIsTypeAnnotationPresent() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mType.isAnnotationPresent(Marker.class); + } + } + + @Test + public void timeIsFieldAnnotationPresent() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mField.isAnnotationPresent(Marker.class); + } + } + + @Test + public void timeIsMethodAnnotationPresent() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mMethod.isAnnotationPresent(Marker.class); + } + } + + // get annotations by result size + + @Test + public void timeGetAllReturnsLargeAnnotation() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasLargeAnnotation.class.getAnnotations(); + } + } + + @Test + public void timeGetAllReturnsSmallAnnotation() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasSmallAnnotation.class.getAnnotations(); + } + } + + @Test + public void timeGetAllReturnsMarkerAnnotation() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasMarkerAnnotation.class.getAnnotations(); + } + } + + @Test + public void timeGetAllReturnsNoAnnotation() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasNoAnnotations.class.getAnnotations(); + } + } + + @Test + public void timeGetAllReturnsThreeAnnotations() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasThreeAnnotations.class.getAnnotations(); + } + } + + // get annotations with inheritance + + @Test + public void timeGetAnnotationsOnSubclass() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + ExtendsHasThreeAnnotations.class.getAnnotations(); + } + } + + @Test + public void timeGetDeclaredAnnotationsOnSubclass() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + ExtendsHasThreeAnnotations.class.getDeclaredAnnotations(); + } + } + + // get annotations with enclosing / inner classes + + @Test + public void timeGetDeclaredClasses() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + AnnotatedElementPerfTest.class.getDeclaredClasses(); + } + } + + @Test + public void timeGetDeclaringClass() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasSmallAnnotation.class.getDeclaringClass(); + } + } + + @Test + public void timeGetEnclosingClass() { + Object anonymousClass = new Object() {}; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + anonymousClass.getClass().getEnclosingClass(); + } + } + + @Test + public void timeGetEnclosingConstructor() { + Object anonymousClass = new Object() {}; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + anonymousClass.getClass().getEnclosingConstructor(); + } + } + + @Test + public void timeGetEnclosingMethod() { + Object anonymousClass = new Object() {}; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + anonymousClass.getClass().getEnclosingMethod(); + } + } + + @Test + public void timeGetModifiers() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasSmallAnnotation.class.getModifiers(); + } + } + + @Test + public void timeGetSimpleName() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasSmallAnnotation.class.getSimpleName(); + } + } + + @Test + public void timeIsAnonymousClass() { + Object anonymousClass = new Object() {}; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + anonymousClass.getClass().isAnonymousClass(); + } + } + + @Test + public void timeIsLocalClass() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + HasSmallAnnotation.class.isLocalClass(); + } + } + + // the annotated elements + + @Marker + public class Type { + @Marker public String field; + + @Marker + public void method(@Marker String parameter) {} + } + + @Large( + a = "on class", + b = {"A", "B", "C"}, + c = @Small(e = "E1", f = 1695938256, g = 7264081114510713000L), + d = {@Small(e = "E2", f = 1695938256, g = 7264081114510713000L)}) + public class HasLargeAnnotation {} + + @Small(e = "E1", f = 1695938256, g = 7264081114510713000L) + public class HasSmallAnnotation {} + + @Marker + public class HasMarkerAnnotation {} + + public class HasNoAnnotations {} + + @Large( + a = "on class", + b = {"A", "B", "C"}, + c = @Small(e = "E1", f = 1695938256, g = 7264081114510713000L), + d = {@Small(e = "E2", f = 1695938256, g = 7264081114510713000L)}) + @Small(e = "E1", f = 1695938256, g = 7264081114510713000L) + @Marker + public class HasThreeAnnotations {} + + public class ExtendsHasThreeAnnotations extends HasThreeAnnotations {} + + // the annotations + + @Retention(RetentionPolicy.RUNTIME) + public @interface Marker {} + + @Retention(RetentionPolicy.RUNTIME) + public @interface Large { + String a() default ""; + + String[] b() default {}; + + Small c() default @Small; + + Small[] d() default {}; + } + + @Retention(RetentionPolicy.RUNTIME) + public @interface Small { + String e() default ""; + + int f() default 0; + + long g() default 0L; + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/BidiPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/BidiPerfTest.java new file mode 100644 index 000000000000..cc56868468e5 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/BidiPerfTest.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2015 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.math.BigDecimal; +import java.text.AttributedCharacterIterator; +import java.text.Bidi; +import java.text.DecimalFormat; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class BidiPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + private static final AttributedCharacterIterator CHAR_ITER = + DecimalFormat.getInstance().formatToCharacterIterator(new BigDecimal(Math.PI)); + + @Test + public void time_createBidiFromIter() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Bidi bidi = new Bidi(CHAR_ITER); + } + } + + @Test + public void time_createBidiFromCharArray() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Bidi bd = + new Bidi( + new char[] {'s', 's', 's'}, + 0, + new byte[] {(byte) 1, (byte) 2, (byte) 3}, + 0, + 3, + Bidi.DIRECTION_RIGHT_TO_LEFT); + } + } + + @Test + public void time_createBidiFromString() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Bidi bidi = new Bidi("Hello", Bidi.DIRECTION_LEFT_TO_RIGHT); + } + } + + @Test + public void time_reorderVisually() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Bidi.reorderVisually( + new byte[] {2, 1, 3, 0, 4}, 0, new String[] {"H", "e", "l", "l", "o"}, 0, 5); + } + } + + @Test + public void time_hebrewBidi() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Bidi bd = + new Bidi( + new char[] {'\u05D0', '\u05D0', '\u05D0'}, + 0, + new byte[] {(byte) -1, (byte) -2, (byte) -3}, + 0, + 3, + Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT); + bd = + new Bidi( + new char[] {'\u05D0', '\u05D0', '\u05D0'}, + 0, + new byte[] {(byte) -1, (byte) -2, (byte) -3}, + 0, + 3, + Bidi.DIRECTION_LEFT_TO_RIGHT); + } + } + + @Test + public void time_complicatedOverrideBidi() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Bidi bd = + new Bidi( + "a\u05D0a\"a\u05D0\"\u05D0a".toCharArray(), + 0, + new byte[] {0, 0, 0, -3, -3, 2, 2, 0, 3}, + 0, + 9, + Bidi.DIRECTION_RIGHT_TO_LEFT); + } + } + + @Test + public void time_requiresBidi() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Bidi.requiresBidi("\u05D0".toCharArray(), 1, 1); // false. + Bidi.requiresBidi("\u05D0".toCharArray(), 0, 1); // true. + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/BigIntegerPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/BigIntegerPerfTest.java new file mode 100644 index 000000000000..662694b1b5d1 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/BigIntegerPerfTest.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.math.BigInteger; +import java.util.Random; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class BigIntegerPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Test + public void timeRandomDivision() throws Exception { + Random r = new Random(); + BigInteger x = new BigInteger(1024, r); + BigInteger y = new BigInteger(1024, r); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + x.divide(y); + } + } + + @Test + public void timeRandomGcd() throws Exception { + Random r = new Random(); + BigInteger x = new BigInteger(1024, r); + BigInteger y = new BigInteger(1024, r); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + x.gcd(y); + } + } + + @Test + public void timeRandomMultiplication() throws Exception { + Random r = new Random(); + BigInteger x = new BigInteger(1024, r); + BigInteger y = new BigInteger(1024, r); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + x.multiply(y); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/BitSetPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/BitSetPerfTest.java new file mode 100644 index 000000000000..db5462cd69bf --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/BitSetPerfTest.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.util.Arrays; +import java.util.BitSet; +import java.util.Collection; + +@RunWith(Parameterized.class) +@LargeTest +public class BitSetPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Parameters(name = "mSize={0}") + public static Collection data() { + return Arrays.asList(new Object[][] {{1000}, {10000}}); + } + + @Parameterized.Parameter(0) + public int mSize; + + private BitSet mBitSet; + + @Before + public void setUp() throws Exception { + mBitSet = new BitSet(mSize); + } + + @Test + public void timeIsEmptyTrue() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + if (!mBitSet.isEmpty()) throw new RuntimeException(); + } + } + + @Test + public void timeIsEmptyFalse() { + mBitSet.set(mBitSet.size() - 1); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + if (mBitSet.isEmpty()) throw new RuntimeException(); + } + } + + @Test + public void timeGet() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + int i = 1; + while (state.keepRunning()) { + mBitSet.get(++i % mSize); + } + } + + @Test + public void timeClear() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + int i = 1; + while (state.keepRunning()) { + mBitSet.clear(++i % mSize); + } + } + + @Test + public void timeSet() { + int i = 1; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mBitSet.set(++i % mSize); + } + } + + @Test + public void timeSetOn() { + int i = 1; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mBitSet.set(++i % mSize, true); + } + } + + @Test + public void timeSetOff() { + int i = 1; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mBitSet.set(++i % mSize, false); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/BreakIteratorPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/BreakIteratorPerfTest.java new file mode 100644 index 000000000000..3952c12b3bfe --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/BreakIteratorPerfTest.java @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2014 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.text.BreakIterator; +import java.util.Arrays; +import java.util.Collection; +import java.util.Locale; + +@RunWith(Parameterized.class) +@LargeTest +public final class BreakIteratorPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + public enum Text { + LIPSUM( + Locale.US, + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi mollis consequat" + + " nisl non pharetra. Praesent pretium vehicula odio sed ultrices. Aenean a" + + " felis libero. Vivamus sed commodo nibh. Pellentesque turpis lectus, euismod" + + " vel ante nec, cursus posuere orci. Suspendisse velit neque, fermentum" + + " luctus ultrices in, ultrices vitae arcu. Duis tincidunt cursus lorem. Nam" + + " ultricies accumsan quam vitae imperdiet. Pellentesque habitant morbi" + + " tristique senectus et netus et malesuada fames ac turpis egestas. Quisque" + + " aliquet pretium nisi, eget laoreet enim molestie sit amet. Class aptent" + + " taciti sociosqu ad litora torquent per conubia nostra, per inceptos" + + " himenaeos.\n" + + "Nam dapibus aliquam lacus ac suscipit. Proin in nibh sit amet purus congue" + + " laoreet eget quis nisl. Morbi gravida dignissim justo, a venenatis ante" + + " pulvinar at. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin" + + " ultrices vestibulum dui, vel aliquam lacus aliquam quis. Duis fringilla" + + " sapien ac lacus egestas, vel adipiscing elit euismod. Donec non tellus" + + " odio. Donec gravida eu massa ac feugiat. Aliquam erat volutpat. Praesent id" + + " adipiscing metus, nec laoreet enim. Aliquam vitae posuere turpis. Mauris ac" + + " pharetra sem. In at placerat tortor. Vivamus ac vehicula neque. Cras" + + " volutpat ullamcorper massa et varius. Praesent sagittis neque vitae nulla" + + " euismod pharetra.\n" + + "Sed placerat sapien non molestie sollicitudin. Nullam sit amet dictum quam." + + " Etiam tincidunt tortor vel pretium vehicula. Praesent fringilla ipsum vel" + + " velit luctus dignissim. Nulla massa ligula, mattis in enim et, mattis" + + " lacinia odio. Suspendisse tristique urna a orci commodo tempor. Duis" + + " lacinia egestas arcu a sollicitudin.\n" + + "In ac feugiat lacus. Nunc fermentum eu est at tristique. Pellentesque quis" + + " ligula et orci placerat lacinia. Maecenas quis mauris diam. Etiam mi ipsum," + + " tempus in purus quis, euismod faucibus orci. Nulla facilisi. Praesent sit" + + " amet sapien vel elit porta adipiscing. Phasellus sit amet volutpat diam.\n" + + "Proin bibendum elit non lacus pharetra, quis eleifend tellus placerat. Nulla" + + " facilisi. Maecenas ante diam, pellentesque mattis mattis in, porta ut" + + " lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices" + + " posuere cubilia Curae; Nunc interdum tristique metus, in scelerisque odio" + + " fermentum eget. Cras nec venenatis lacus. Aenean euismod eget metus quis" + + " molestie. Cras tincidunt dolor ut massa ornare, in elementum lacus auctor." + + " Cras sodales nisl lacus, id ultrices ligula varius at. Sed tristique sit" + + " amet tellus vel mollis. Sed sed sollicitudin quam. Sed sed adipiscing" + + " risus, et dictum orci. Cras tempor pellentesque turpis et tempus."), + LONGPARA( + Locale.US, + "During dinner, Mr. Bennet scarcely spoke at all; but when the servants were" + + " withdrawn, he thought it time to have some conversation with his guest, and" + + " therefore started a subject in which he expected him to shine, by observing" + + " that he seemed very fortunate in his patroness. Lady Catherine de Bourgh's" + + " attention to his wishes, and consideration for his comfort, appeared very" + + " remarkable. Mr. Bennet could not have chosen better. Mr. Collins was" + + " eloquent in her praise. The subject elevated him to more than usual" + + " solemnity of manner, and with a most important aspect he protested that" + + " \"he had never in his life witnessed such behaviour in a person of" + + " rank--such affability and condescension, as he had himself experienced from" + + " Lady Catherine. She had been graciously pleased to approve of both of the" + + " discourses which he had already had the honour of preaching before her. She" + + " had also asked him twice to dine at Rosings, and had sent for him only the" + + " Saturday before, to make up her pool of quadrille in the evening. Lady" + + " Catherine was reckoned proud by many people he knew, but _he_ had never" + + " seen anything but affability in her. She had always spoken to him as she" + + " would to any other gentleman; she made not the smallest objection to his" + + " joining in the society of the neighbourhood nor to his leaving the parish" + + " occasionally for a week or two, to visit his relations. She had even" + + " condescended to advise him to marry as soon as he could, provided he chose" + + " with discretion; and had once paid him a visit in his humble parsonage," + + " where she had perfectly approved all the alterations he had been making," + + " and had even vouchsafed to suggest some herself--some shelves in the closet" + + " up stairs.\""), + GERMAN( + Locale.GERMANY, + "Aber dieser Freiheit setzte endlich der Winter ein Ziel. Draußen auf den Feldern" + + " und den hohen Bergen lag der Schnee und Peter wäre in seinem dünnen" + + " Leinwandjäckchen bald erfroren. Es war also seine einzige Freude, hinaus" + + " vor die Hütte zu treten und den Sperlingen Brotkrümchen zu streuen, was er" + + " sich jedesmal an seinem Frühstück absparte. Wenn nun die Vögel so lustig" + + " zwitscherten und um ihn herumflogen, da klopfte ihm das Herz vor Lust, und" + + " oft gab er ihnen sein ganzes Stück Schwarzbrot, ohne daran zu denken, daß" + + " er dafür alsdann selbst hungern müsse."), + THAI( + Locale.forLanguageTag("th-TH"), + "เป็นสำเนียงทางการของภาษาไทย" + + " เดิมทีเป็นการผสมผสานกันระหว่างสำเนียงอยุธยาและชาวไทยเชื้อสายจีนรุ่นหลังที่" + + "พูดไทยแทนกลุ่มภาษาจีน" + + " ลักษณะเด่นคือมีการออกเสียงที่ชัดเจนและแข็งกระด้างซึ่งได้รับอิทธิพลจากภาษาแต" + + "้จิ๋ว" + + " การออกเสียงพยัญชนะ สระ การผันวรรณยุกต์ที่ในภาษาไทยมาตรฐาน" + + " มาจากสำเนียงถิ่นนี้ในขณะที่ภาษาไทยสำเนียงอื่นล้วนเหน่อทั้งสิ้น" + + " คำศัพท์ที่ใช้ในสำเนียงกรุงเทพจำนวนมากได้รับมาจากกลุ่มภาษาจีนเช่นคำว่า โป๊," + + " เฮ็ง, อาหมวย, อาซิ่ม ซึ่งมาจากภาษาแต้จิ๋ว และจากภาษาจีนเช่น ถู(涂), ชิ่ว(去" + + " อ่านว่า\"ชู่\") และคำว่า ทาย(猜 อ่านว่า \"ชาย\") เป็นต้น" + + " เนื่องจากสำเนียงกรุงเทพได้รับอิทธิพลมาจากภาษาจีนดังนั้นตัวอักษร \"ร\"" + + " มักออกเสียงเหมารวมเป็น \"ล\" หรือคำควบกล่ำบางคำถูกละทิ้งไปด้วยเช่น รู้ เป็น" + + " ลู้, เรื่อง เป็น เลื่อง หรือ ประเทศ เป็น ปะเทศ" + + " เป็นต้นสร้างความลำบากให้แก่ต่างชาติที่ต้องการเรียนภาษาไทย" + + " แต่อย่างไรก็ตามผู้ที่พูดสำเนียงถิ่นนี้ก็สามารถออกอักขระภาษาไทยตามมาตรฐานได" + + "้อย่างถูกต้องเพียงแต่มักเผลอไม่ค่อยออกเสียง"), + THAI2(Locale.forLanguageTag("th-TH"), "this is the word browser in Thai: เบราว์เซอร์"), + TABS(Locale.US, "one\t\t\t\t\t\t\t\t\t\t\t\t\t\ttwo\n"), + ACCENT(Locale.US, "e\u0301\u00e9\nwhich is:\n\"e\\u0301\\u00e9\""), + EMOJI(Locale.US, ">>\ud83d\ude01<<\nwhich is:\n\">>\\ud83d\\ude01<<\""), + SPACES(Locale.US, " leading spaces and trailing ones too "), + EMPTY(Locale.US, ""), + NEWLINE(Locale.US, "\\n:\n"), + BIDI( + Locale.forLanguageTag("he-IL"), + "Sarah שרה is spelled sin ש resh ר heh ה from right to left."); + + final Locale mLocale; + final String mText; + + Text(Locale locale, String text) { + this.mText = text; + this.mLocale = locale; + } + } + + @Parameters(name = "mText={0}") + public static Collection data() { + return Arrays.asList( + new Object[][] { + {Text.ACCENT}, {Text.BIDI}, {Text.EMOJI}, {Text.EMPTY}, {Text.GERMAN}, + {Text.LIPSUM}, {Text.LONGPARA}, {Text.NEWLINE}, {Text.SPACES}, {Text.TABS}, + {Text.THAI}, {Text.THAI2} + }); + } + + @Parameterized.Parameter(0) + public Text mText; + + @Test + public void timeBreakIterator() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + BreakIterator it = BreakIterator.getLineInstance(mText.mLocale); + it.setText(mText.mText); + + while (it.next() != BreakIterator.DONE) { + // Keep iterating + } + } + } + + @Test + public void timeIcuBreakIterator() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + android.icu.text.BreakIterator it = + android.icu.text.BreakIterator.getLineInstance(mText.mLocale); + it.setText(mText.mText); + + while (it.next() != android.icu.text.BreakIterator.DONE) { + // Keep iterating + } + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferBulkPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferBulkPerfTest.java new file mode 100644 index 000000000000..8e57b28a0550 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferBulkPerfTest.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +@LargeTest +public class ByteBufferBulkPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Parameters(name = "mAligned({0}), mSrcBufferType({1}), mDataBufferType({2}), mBufferSize({3})") + public static Collection data() { + return Arrays.asList( + new Object[][] { + {true, MyBufferType.DIRECT, MyBufferType.DIRECT, 4096}, + {false, MyBufferType.DIRECT, MyBufferType.DIRECT, 4096}, + {true, MyBufferType.HEAP, MyBufferType.DIRECT, 4096}, + {false, MyBufferType.HEAP, MyBufferType.DIRECT, 4096}, + {true, MyBufferType.MAPPED, MyBufferType.DIRECT, 4096}, + {false, MyBufferType.MAPPED, MyBufferType.DIRECT, 4096}, + {true, MyBufferType.DIRECT, MyBufferType.HEAP, 4096}, + {false, MyBufferType.DIRECT, MyBufferType.HEAP, 4096}, + {true, MyBufferType.HEAP, MyBufferType.HEAP, 4096}, + {false, MyBufferType.HEAP, MyBufferType.HEAP, 4096}, + {true, MyBufferType.MAPPED, MyBufferType.HEAP, 4096}, + {false, MyBufferType.MAPPED, MyBufferType.HEAP, 4096}, + {true, MyBufferType.DIRECT, MyBufferType.MAPPED, 4096}, + {false, MyBufferType.DIRECT, MyBufferType.MAPPED, 4096}, + {true, MyBufferType.HEAP, MyBufferType.MAPPED, 4096}, + {false, MyBufferType.HEAP, MyBufferType.MAPPED, 4096}, + {true, MyBufferType.MAPPED, MyBufferType.MAPPED, 4096}, + {false, MyBufferType.MAPPED, MyBufferType.MAPPED, 4096}, + {true, MyBufferType.DIRECT, MyBufferType.DIRECT, 1232896}, + {false, MyBufferType.DIRECT, MyBufferType.DIRECT, 1232896}, + {true, MyBufferType.HEAP, MyBufferType.DIRECT, 1232896}, + {false, MyBufferType.HEAP, MyBufferType.DIRECT, 1232896}, + {true, MyBufferType.MAPPED, MyBufferType.DIRECT, 1232896}, + {false, MyBufferType.MAPPED, MyBufferType.DIRECT, 1232896}, + {true, MyBufferType.DIRECT, MyBufferType.HEAP, 1232896}, + {false, MyBufferType.DIRECT, MyBufferType.HEAP, 1232896}, + {true, MyBufferType.HEAP, MyBufferType.HEAP, 1232896}, + {false, MyBufferType.HEAP, MyBufferType.HEAP, 1232896}, + {true, MyBufferType.MAPPED, MyBufferType.HEAP, 1232896}, + {false, MyBufferType.MAPPED, MyBufferType.HEAP, 1232896}, + {true, MyBufferType.DIRECT, MyBufferType.MAPPED, 1232896}, + {false, MyBufferType.DIRECT, MyBufferType.MAPPED, 1232896}, + {true, MyBufferType.HEAP, MyBufferType.MAPPED, 1232896}, + {false, MyBufferType.HEAP, MyBufferType.MAPPED, 1232896}, + {true, MyBufferType.MAPPED, MyBufferType.MAPPED, 1232896}, + {false, MyBufferType.MAPPED, MyBufferType.MAPPED, 1232896}, + }); + } + + @Parameterized.Parameter(0) + public boolean mAligned; + + enum MyBufferType { + DIRECT, + HEAP, + MAPPED + } + + @Parameterized.Parameter(1) + public MyBufferType mSrcBufferType; + + @Parameterized.Parameter(2) + public MyBufferType mDataBufferType; + + @Parameterized.Parameter(3) + public int mBufferSize; + + public static ByteBuffer newBuffer(boolean aligned, MyBufferType bufferType, int bsize) + throws IOException { + int size = aligned ? bsize : bsize + 8 + 1; + ByteBuffer result = null; + switch (bufferType) { + case DIRECT: + result = ByteBuffer.allocateDirect(size); + break; + case HEAP: + result = ByteBuffer.allocate(size); + break; + case MAPPED: + File tmpFile = File.createTempFile("MappedByteBufferTest", ".tmp"); + tmpFile.createNewFile(); + tmpFile.deleteOnExit(); + RandomAccessFile raf = new RandomAccessFile(tmpFile, "rw"); + raf.setLength(size); + FileChannel fc = raf.getChannel(); + result = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()); + break; + } + result.position(aligned ? 0 : 1); + return result; + } + + @Test + public void timeByteBuffer_putByteBuffer() throws Exception { + ByteBuffer src = ByteBufferBulkPerfTest.newBuffer(mAligned, mSrcBufferType, mBufferSize); + ByteBuffer data = ByteBufferBulkPerfTest.newBuffer(mAligned, mDataBufferType, mBufferSize); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + data.position(mAligned ? 0 : 1); + src.put(data); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferPerfTest.java new file mode 100644 index 000000000000..4bd7c4e4fa82 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferPerfTest.java @@ -0,0 +1,532 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.CharBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.nio.ShortBuffer; +import java.nio.channels.FileChannel; +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +@LargeTest +public class ByteBufferPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + public enum MyByteOrder { + BIG(ByteOrder.BIG_ENDIAN), + LITTLE(ByteOrder.LITTLE_ENDIAN); + final ByteOrder mByteOrder; + + MyByteOrder(ByteOrder mByteOrder) { + this.mByteOrder = mByteOrder; + } + } + + @Parameters(name = "mByteOrder={0}, mAligned={1}, mBufferType={2}") + public static Collection data() { + return Arrays.asList( + new Object[][] { + {MyByteOrder.BIG, true, MyBufferType.DIRECT}, + {MyByteOrder.LITTLE, true, MyBufferType.DIRECT}, + {MyByteOrder.BIG, false, MyBufferType.DIRECT}, + {MyByteOrder.LITTLE, false, MyBufferType.DIRECT}, + {MyByteOrder.BIG, true, MyBufferType.HEAP}, + {MyByteOrder.LITTLE, true, MyBufferType.HEAP}, + {MyByteOrder.BIG, false, MyBufferType.HEAP}, + {MyByteOrder.LITTLE, false, MyBufferType.HEAP}, + {MyByteOrder.BIG, true, MyBufferType.MAPPED}, + {MyByteOrder.LITTLE, true, MyBufferType.MAPPED}, + {MyByteOrder.BIG, false, MyBufferType.MAPPED}, + {MyByteOrder.LITTLE, false, MyBufferType.MAPPED} + }); + } + + @Parameterized.Parameter(0) + public MyByteOrder mByteOrder; + + @Parameterized.Parameter(1) + public boolean mAligned; + + enum MyBufferType { + DIRECT, + HEAP, + MAPPED; + } + + @Parameterized.Parameter(2) + public MyBufferType mBufferType; + + public static ByteBuffer newBuffer( + MyByteOrder byteOrder, boolean aligned, MyBufferType bufferType) throws IOException { + int size = aligned ? 8192 : 8192 + 8 + 1; + ByteBuffer result = null; + switch (bufferType) { + case DIRECT: + result = ByteBuffer.allocateDirect(size); + break; + case HEAP: + result = ByteBuffer.allocate(size); + break; + case MAPPED: + File tmpFile = new File("/sdcard/bm.tmp"); + if (new File("/tmp").isDirectory()) { + // We're running on the desktop. + tmpFile = File.createTempFile("MappedByteBufferTest", ".tmp"); + } + tmpFile.createNewFile(); + tmpFile.deleteOnExit(); + RandomAccessFile raf = new RandomAccessFile(tmpFile, "rw"); + raf.setLength(8192 * 8); + FileChannel fc = raf.getChannel(); + result = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()); + break; + } + result.order(byteOrder.mByteOrder); + result.position(aligned ? 0 : 1); + return result; + } + + // + // peeking + // + + @Test + public void timeByteBuffer_getByte() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.get(); + } + } + } + + @Test + public void timeByteBuffer_getByteArray() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + byte[] dst = new byte[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + src.position(mAligned ? 0 : 1); + src.get(dst); + } + } + } + + @Test + public void timeByteBuffer_getByte_indexed() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.get(i); + } + } + } + + @Test + public void timeByteBuffer_getChar() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.getChar(); + } + } + } + + @Test + public void timeCharBuffer_getCharArray() throws Exception { + CharBuffer src = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asCharBuffer(); + char[] dst = new char[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + src.position(0); + src.get(dst); + } + } + } + + @Test + public void timeByteBuffer_getChar_indexed() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.getChar(i * 2); + } + } + } + + @Test + public void timeByteBuffer_getDouble() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.getDouble(); + } + } + } + + @Test + public void timeDoubleBuffer_getDoubleArray() throws Exception { + DoubleBuffer src = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asDoubleBuffer(); + double[] dst = new double[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + src.position(0); + src.get(dst); + } + } + } + + @Test + public void timeByteBuffer_getFloat() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.getFloat(); + } + } + } + + @Test + public void timeFloatBuffer_getFloatArray() throws Exception { + FloatBuffer src = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asFloatBuffer(); + float[] dst = new float[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + src.position(0); + src.get(dst); + } + } + } + + @Test + public void timeByteBuffer_getInt() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.getInt(); + } + } + } + + @Test + public void timeIntBuffer_getIntArray() throws Exception { + IntBuffer src = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asIntBuffer(); + int[] dst = new int[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + src.position(0); + src.get(dst); + } + } + } + + @Test + public void timeByteBuffer_getLong() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.getLong(); + } + } + } + + @Test + public void timeLongBuffer_getLongArray() throws Exception { + LongBuffer src = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asLongBuffer(); + long[] dst = new long[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + src.position(0); + src.get(dst); + } + } + } + + @Test + public void timeByteBuffer_getShort() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.getShort(); + } + } + } + + @Test + public void timeShortBuffer_getShortArray() throws Exception { + ShortBuffer src = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asShortBuffer(); + short[] dst = new short[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + src.position(0); + src.get(dst); + } + } + } + + // + // poking + // + + @Test + public void timeByteBuffer_putByte() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(0); + for (int i = 0; i < 1024; ++i) { + src.put((byte) 0); + } + } + } + + @Test + public void timeByteBuffer_putByteArray() throws Exception { + ByteBuffer dst = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + byte[] src = new byte[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + dst.position(mAligned ? 0 : 1); + dst.put(src); + } + } + } + + @Test + public void timeByteBuffer_putChar() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.putChar(' '); + } + } + } + + @Test + public void timeCharBuffer_putCharArray() throws Exception { + CharBuffer dst = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asCharBuffer(); + char[] src = new char[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + dst.position(0); + dst.put(src); + } + } + } + + @Test + public void timeByteBuffer_putDouble() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.putDouble(0.0); + } + } + } + + @Test + public void timeDoubleBuffer_putDoubleArray() throws Exception { + DoubleBuffer dst = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asDoubleBuffer(); + double[] src = new double[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + dst.position(0); + dst.put(src); + } + } + } + + @Test + public void timeByteBuffer_putFloat() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.putFloat(0.0f); + } + } + } + + @Test + public void timeFloatBuffer_putFloatArray() throws Exception { + FloatBuffer dst = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asFloatBuffer(); + float[] src = new float[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + dst.position(0); + dst.put(src); + } + } + } + + @Test + public void timeByteBuffer_putInt() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.putInt(0); + } + } + } + + @Test + public void timeIntBuffer_putIntArray() throws Exception { + IntBuffer dst = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asIntBuffer(); + int[] src = new int[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + dst.position(0); + dst.put(src); + } + } + } + + @Test + public void timeByteBuffer_putLong() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.putLong(0L); + } + } + } + + @Test + public void timeLongBuffer_putLongArray() throws Exception { + LongBuffer dst = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asLongBuffer(); + long[] src = new long[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + dst.position(0); + dst.put(src); + } + } + } + + @Test + public void timeByteBuffer_putShort() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + for (int i = 0; i < 1024; ++i) { + src.putShort((short) 0); + } + } + } + + @Test + public void timeShortBuffer_putShortArray() throws Exception { + ShortBuffer dst = + ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType).asShortBuffer(); + short[] src = new short[1024]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < 1024; ++i) { + dst.position(0); + dst.put(src); + } + } + } + + @Test + public void time_new_byteArray() throws Exception { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + byte[] bs = new byte[8192]; + } + } + + @Test + public void time_ByteBuffer_allocate() throws Exception { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + ByteBuffer bs = ByteBuffer.allocate(8192); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferScalarVersusVectorPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferScalarVersusVectorPerfTest.java new file mode 100644 index 000000000000..81f9e59f2423 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/ByteBufferScalarVersusVectorPerfTest.java @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +@LargeTest +public class ByteBufferScalarVersusVectorPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Parameters(name = "mByteOrder={0}, mAligned={1}, mBufferType={2}") + public static Collection data() { + return Arrays.asList( + new Object[][] { + { + ByteBufferPerfTest.MyByteOrder.BIG, + true, + ByteBufferPerfTest.MyBufferType.DIRECT + }, + { + ByteBufferPerfTest.MyByteOrder.LITTLE, + true, + ByteBufferPerfTest.MyBufferType.DIRECT + }, + { + ByteBufferPerfTest.MyByteOrder.BIG, + false, + ByteBufferPerfTest.MyBufferType.DIRECT + }, + { + ByteBufferPerfTest.MyByteOrder.LITTLE, + false, + ByteBufferPerfTest.MyBufferType.DIRECT + }, + { + ByteBufferPerfTest.MyByteOrder.BIG, + true, + ByteBufferPerfTest.MyBufferType.HEAP + }, + { + ByteBufferPerfTest.MyByteOrder.LITTLE, + true, + ByteBufferPerfTest.MyBufferType.HEAP + }, + { + ByteBufferPerfTest.MyByteOrder.BIG, + false, + ByteBufferPerfTest.MyBufferType.HEAP + }, + { + ByteBufferPerfTest.MyByteOrder.LITTLE, + false, + ByteBufferPerfTest.MyBufferType.HEAP + }, + { + ByteBufferPerfTest.MyByteOrder.BIG, + true, + ByteBufferPerfTest.MyBufferType.MAPPED + }, + { + ByteBufferPerfTest.MyByteOrder.LITTLE, + true, + ByteBufferPerfTest.MyBufferType.MAPPED + }, + { + ByteBufferPerfTest.MyByteOrder.BIG, + false, + ByteBufferPerfTest.MyBufferType.MAPPED + }, + { + ByteBufferPerfTest.MyByteOrder.LITTLE, + false, + ByteBufferPerfTest.MyBufferType.MAPPED + } + }); + } + + @Parameterized.Parameter(0) + public ByteBufferPerfTest.MyByteOrder mByteOrder; + + @Parameterized.Parameter(1) + public boolean mAligned; + + @Parameterized.Parameter(2) + public ByteBufferPerfTest.MyBufferType mBufferType; + + @Test + public void timeManualByteBufferCopy() throws Exception { + ByteBuffer src = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + ByteBuffer dst = ByteBufferPerfTest.newBuffer(mByteOrder, mAligned, mBufferType); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(0); + dst.position(0); + for (int i = 0; i < 8192; ++i) { + dst.put(src.get()); + } + } + } + + @Test + public void timeByteBufferBulkGet() throws Exception { + ByteBuffer src = ByteBuffer.allocate(mAligned ? 8192 : 8192 + 1); + byte[] dst = new byte[8192]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + src.get(dst, 0, dst.length); + } + } + + @Test + public void timeDirectByteBufferBulkGet() throws Exception { + ByteBuffer src = ByteBuffer.allocateDirect(mAligned ? 8192 : 8192 + 1); + byte[] dst = new byte[8192]; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + src.position(mAligned ? 0 : 1); + src.get(dst, 0, dst.length); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CharacterPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CharacterPerfTest.java new file mode 100644 index 000000000000..28ec6ded3c86 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/CharacterPerfTest.java @@ -0,0 +1,359 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.util.Arrays; +import java.util.Collection; + +/** + * Tests various Character methods, intended for testing multiple implementations against each + * other. + */ +@RunWith(Parameterized.class) +@LargeTest +public class CharacterPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Parameters(name = "mCharacterSet({0}), mOverload({1})") + public static Collection data() { + return Arrays.asList( + new Object[][] { + {CharacterSet.ASCII, Overload.CHAR}, + {CharacterSet.ASCII, Overload.INT}, + {CharacterSet.UNICODE, Overload.CHAR}, + {CharacterSet.UNICODE, Overload.INT} + }); + } + + @Parameterized.Parameter(0) + public CharacterSet mCharacterSet; + + @Parameterized.Parameter(1) + public Overload mOverload; + + private char[] mChars; + + @Before + public void setUp() throws Exception { + this.mChars = mCharacterSet.mChars; + } + + public enum Overload { + CHAR, + INT + } + + public double nanosToUnits(double nanos) { + return nanos / 65536; + } + + public enum CharacterSet { + ASCII(128), + UNICODE(65536); + final char[] mChars; + + CharacterSet(int size) { + this.mChars = new char[65536]; + for (int i = 0; i < 65536; ++i) { + mChars[i] = (char) (i % size); + } + } + } + + // A fake benchmark to give us a baseline. + @Test + public void timeIsSpace() { + boolean fake = false; + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + fake ^= ((char) ch == ' '); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + fake ^= (ch == ' '); + } + } + } + } + + @Test + public void timeDigit() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.digit(mChars[ch], 10); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.digit((int) mChars[ch], 10); + } + } + } + } + + @Test + public void timeGetNumericValue() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.getNumericValue(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.getNumericValue((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsDigit() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isDigit(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isDigit((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsIdentifierIgnorable() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isIdentifierIgnorable(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isIdentifierIgnorable((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsJavaIdentifierPart() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isJavaIdentifierPart(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isJavaIdentifierPart((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsJavaIdentifierStart() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isJavaIdentifierStart(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isJavaIdentifierStart((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsLetter() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isLetter(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isLetter((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsLetterOrDigit() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isLetterOrDigit(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isLetterOrDigit((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsLowerCase() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isLowerCase(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isLowerCase((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsSpaceChar() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isSpaceChar(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isSpaceChar((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsUpperCase() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isUpperCase(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isUpperCase((int) mChars[ch]); + } + } + } + } + + @Test + public void timeIsWhitespace() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isWhitespace(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.isWhitespace((int) mChars[ch]); + } + } + } + } + + @Test + public void timeToLowerCase() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.toLowerCase(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.toLowerCase((int) mChars[ch]); + } + } + } + } + + @Test + public void timeToUpperCase() { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + if (mOverload == Overload.CHAR) { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.toUpperCase(mChars[ch]); + } + } + } else { + while (state.keepRunning()) { + for (int ch = 0; ch < 65536; ++ch) { + Character.toUpperCase((int) mChars[ch]); + } + } + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CharsetForNamePerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CharsetForNamePerfTest.java new file mode 100644 index 000000000000..603b182e7c36 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/CharsetForNamePerfTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +@LargeTest +public class CharsetForNamePerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Parameterized.Parameters(name = "mCharsetName({0})") + public static Collection data() { + return Arrays.asList( + new Object[][] { + {"UTF-16"}, + {"UTF-8"}, + {"UTF8"}, + {"ISO-8859-1"}, + {"8859_1"}, + {"ISO-8859-2"}, + {"8859_2"}, + {"US-ASCII"}, + {"ASCII"}, + }); + } + + @Parameterized.Parameter(0) + public String mCharsetName; + + @Test + public void timeCharsetForName() throws Exception { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Charset.forName(mCharsetName); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CharsetPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CharsetPerfTest.java new file mode 100644 index 000000000000..437d186834e0 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/CharsetPerfTest.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +@LargeTest +public class CharsetPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Parameters(name = "mLength({0}), mName({1})") + public static Collection data() { + return Arrays.asList( + new Object[][] { + {1, "UTF-16"}, + {1, "UTF-8"}, + {1, "UTF8"}, + {1, "ISO-8859-1"}, + {1, "8859_1"}, + {1, "ISO-8859-2"}, + {1, "8859_2"}, + {1, "US-ASCII"}, + {1, "ASCII"}, + {10, "UTF-16"}, + {10, "UTF-8"}, + {10, "UTF8"}, + {10, "ISO-8859-1"}, + {10, "8859_1"}, + {10, "ISO-8859-2"}, + {10, "8859_2"}, + {10, "US-ASCII"}, + {10, "ASCII"}, + {100, "UTF-16"}, + {100, "UTF-8"}, + {100, "UTF8"}, + {100, "ISO-8859-1"}, + {100, "8859_1"}, + {100, "ISO-8859-2"}, + {100, "8859_2"}, + {100, "US-ASCII"}, + {100, "ASCII"}, + {1000, "UTF-16"}, + {1000, "UTF-8"}, + {1000, "UTF8"}, + {1000, "ISO-8859-1"}, + {1000, "8859_1"}, + {1000, "ISO-8859-2"}, + {1000, "8859_2"}, + {1000, "US-ASCII"}, + {1000, "ASCII"}, + {10000, "UTF-16"}, + {10000, "UTF-8"}, + {10000, "UTF8"}, + {10000, "ISO-8859-1"}, + {10000, "8859_1"}, + {10000, "ISO-8859-2"}, + {10000, "8859_2"}, + {10000, "US-ASCII"}, + {10000, "ASCII"}, + }); + } + + @Parameterized.Parameter(0) + public int mLength; + + @Parameterized.Parameter(1) + public String mName; + + @Test + public void time_new_String_BString() throws Exception { + byte[] bytes = makeBytes(makeString(mLength)); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + new String(bytes, mName); + } + } + + @Test + public void time_new_String_BII() throws Exception { + byte[] bytes = makeBytes(makeString(mLength)); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + new String(bytes, 0, bytes.length); + } + } + + @Test + public void time_new_String_BIIString() throws Exception { + byte[] bytes = makeBytes(makeString(mLength)); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + new String(bytes, 0, bytes.length, mName); + } + } + + @Test + public void time_String_getBytes() throws Exception { + String string = makeString(mLength); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + string.getBytes(mName); + } + } + + private static String makeString(int length) { + StringBuilder result = new StringBuilder(length); + for (int i = 0; i < length; ++i) { + result.append('A' + (i % 26)); + } + return result.toString(); + } + + private static byte[] makeBytes(String s) { + try { + return s.getBytes("US-ASCII"); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CharsetUtf8PerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CharsetUtf8PerfTest.java new file mode 100644 index 000000000000..f31e9c154f15 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/CharsetUtf8PerfTest.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2017 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.libcore.regression; + +import android.icu.lang.UCharacter; +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.nio.charset.Charset; + +/** + * Decode the same size of ASCII, BMP, Supplementary character using fast-path UTF-8 decoder. The + * fast-path code is in {@link StringFactory#newStringFromBytes(byte[], int, int, Charset)} + */ +@RunWith(AndroidJUnit4.class) +@LargeTest +public class CharsetUtf8PerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + private final int mNoOfBytes = 0x100; // 4MB + + private void makeUnicodeRange(int startingCodePoint, int endingCodePoint, int repeated) { + StringBuilder builder = new StringBuilder(); + for (int codePoint = startingCodePoint; codePoint <= endingCodePoint; codePoint++) { + if (codePoint < Character.MIN_SURROGATE || codePoint > Character.MAX_SURROGATE) { + builder.append(UCharacter.toString(codePoint)); + } + } + + String str = builder.toString(); + StringBuilder builder2 = new StringBuilder(); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + for (int i = 0; i < repeated; i++) { + builder2.append(str); + } + } + } + + @Test + public void time_ascii() { + makeUnicodeRange(0, 0x7f, mNoOfBytes / 0x80); + } + + @Test + public void time_bmp2() { + makeUnicodeRange(0x0080, 0x07ff, mNoOfBytes / 2 / 0x780); + } + + @Test + public void time_bmp3() { + makeUnicodeRange( + 0x0800, + 0xffff, + mNoOfBytes / 3 / 0xf000 /* 0x10000 - 0x0800 - no of surrogate code points */); + } + + @Test + public void time_supplementary() { + makeUnicodeRange(0x10000, 0x10ffff, mNoOfBytes / 4 / 0x100000); + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/ChecksumPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/ChecksumPerfTest.java new file mode 100644 index 000000000000..1d33fcb250b9 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/ChecksumPerfTest.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.zip.Adler32; +import java.util.zip.CRC32; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class ChecksumPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Test + public void timeAdler_block() throws Exception { + byte[] bytes = new byte[10000]; + Adler32 adler = new Adler32(); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + adler.update(bytes); + } + } + + @Test + public void timeAdler_byte() throws Exception { + Adler32 adler = new Adler32(); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + adler.update(1); + } + } + + @Test + public void timeCrc_block() throws Exception { + byte[] bytes = new byte[10000]; + CRC32 crc = new CRC32(); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + crc.update(bytes); + } + } + + @Test + public void timeCrc_byte() throws Exception { + CRC32 crc = new CRC32(); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + crc.update(1); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CipherInputStreamPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CipherInputStreamPerfTest.java new file mode 100644 index 000000000000..35730ec753f1 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/CipherInputStreamPerfTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.security.spec.AlgorithmParameterSpec; + +import javax.crypto.Cipher; +import javax.crypto.CipherInputStream; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +/** CipherInputStream benchmark. */ +@RunWith(AndroidJUnit4.class) +@LargeTest +public class CipherInputStreamPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + private static final int DATA_SIZE = 1024 * 1024; + private static final byte[] DATA = new byte[DATA_SIZE]; + + private static final int IV_SIZE = 16; + private static final byte[] IV = new byte[IV_SIZE]; + + static { + for (int i = 0; i < DATA_SIZE; i++) { + DATA[i] = (byte) i; + } + for (int i = 0; i < IV_SIZE; i++) { + IV[i] = (byte) i; + } + } + + private SecretKey mKey; + + private byte[] mOutput = new byte[8192]; + + private Cipher mCipherEncrypt; + + private AlgorithmParameterSpec mSpec; + + @Before + public void setUp() throws Exception { + KeyGenerator generator = KeyGenerator.getInstance("AES"); + generator.init(128); + mKey = generator.generateKey(); + + mSpec = new IvParameterSpec(IV); + + mCipherEncrypt = Cipher.getInstance("AES/CBC/PKCS5Padding"); + mCipherEncrypt.init(Cipher.ENCRYPT_MODE, mKey, mSpec); + } + + @Test + public void timeEncrypt() throws Exception { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mCipherEncrypt.init(Cipher.ENCRYPT_MODE, mKey, mSpec); + InputStream is = new CipherInputStream(new ByteArrayInputStream(DATA), mCipherEncrypt); + while (is.read(mOutput) != -1) { + // Keep iterating + } + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CipherPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CipherPerfTest.java new file mode 100644 index 000000000000..15c27f2366e1 --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/CipherPerfTest.java @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.security.spec.AlgorithmParameterSpec; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +/** + * Cipher benchmarks. Only runs on AES currently because of the combinatorial explosion of the test + * as it stands. + */ +@RunWith(Parameterized.class) +@LargeTest +public class CipherPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Parameterized.Parameters( + name = + "mMode({0}), mPadding({1}), mKeySize({2}), mInputSize({3})," + + " mImplementation({4})") + public static Collection cases() { + int[] mKeySizes = new int[] {128, 192, 256}; + int[] inputSizes = new int[] {16, 32, 64, 128, 1024, 8192}; + final List params = new ArrayList<>(); + for (Mode mode : Mode.values()) { + for (Padding padding : Padding.values()) { + for (Implementation implementation : Implementation.values()) { + if ((mode == Mode.CBC + || mode == Mode.CFB + || mode == Mode.CTR + || mode == Mode.ECB + || mode == Mode.OFB) + && padding == Padding.PKCS1PADDING) { + continue; + } + if ((mode == Mode.CFB || mode == Mode.OFB) + && padding == Padding.NOPADDING + && implementation == Implementation.OpenSSL) { + continue; + } + for (int mKeySize : mKeySizes) { + for (int inputSize : inputSizes) { + params.add( + new Object[] { + mode, padding, mKeySize, inputSize, implementation + }); + } + } + } + } + } + return params; + } + + private static final int DATA_SIZE = 8192; + private static final byte[] DATA = new byte[DATA_SIZE]; + + private static final int IV_SIZE = 16; + + private static final byte[] IV = new byte[IV_SIZE]; + + static { + for (int i = 0; i < DATA_SIZE; i++) { + DATA[i] = (byte) i; + } + for (int i = 0; i < IV_SIZE; i++) { + IV[i] = (byte) i; + } + } + + public Algorithm mAlgorithm = Algorithm.AES; + + public enum Algorithm { + AES, + }; + + @Parameterized.Parameter(0) + public Mode mMode; + + public enum Mode { + CBC, + CFB, + CTR, + ECB, + OFB, + }; + + @Parameterized.Parameter(1) + public Padding mPadding; + + public enum Padding { + NOPADDING, + PKCS1PADDING, + }; + + @Parameterized.Parameter(2) + public int mKeySize; + + @Parameterized.Parameter(3) + public int mInputSize; + + @Parameterized.Parameter(4) + public Implementation mImplementation; + + public enum Implementation { + OpenSSL, + BouncyCastle + }; + + private String mProviderName; + + // Key generation isn't part of the benchmark so cache the results + private static Map sKeySizes = new HashMap(); + + private String mCipherAlgorithm; + private SecretKey mKey; + + private byte[] mOutput = new byte[DATA.length]; + + private Cipher mCipherEncrypt; + + private Cipher mCipherDecrypt; + + private AlgorithmParameterSpec mSpec; + + @Before + public void setUp() throws Exception { + mCipherAlgorithm = + mAlgorithm.toString() + "/" + mMode.toString() + "/" + mPadding.toString(); + + String mKeyAlgorithm = mAlgorithm.toString(); + mKey = sKeySizes.get(mKeySize); + if (mKey == null) { + KeyGenerator generator = KeyGenerator.getInstance(mKeyAlgorithm); + generator.init(mKeySize); + mKey = generator.generateKey(); + sKeySizes.put(mKeySize, mKey); + } + + switch (mImplementation) { + case OpenSSL: + mProviderName = "AndroidOpenSSL"; + break; + case BouncyCastle: + mProviderName = "BC"; + break; + default: + throw new RuntimeException(mImplementation.toString()); + } + + if (mMode != Mode.ECB) { + mSpec = new IvParameterSpec(IV); + } + + mCipherEncrypt = Cipher.getInstance(mCipherAlgorithm, mProviderName); + mCipherEncrypt.init(Cipher.ENCRYPT_MODE, mKey, mSpec); + + mCipherDecrypt = Cipher.getInstance(mCipherAlgorithm, mProviderName); + mCipherDecrypt.init(Cipher.DECRYPT_MODE, mKey, mSpec); + } + + @Test + public void timeEncrypt() throws Exception { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mCipherEncrypt.doFinal(DATA, 0, mInputSize, mOutput); + } + } + + @Test + public void timeDecrypt() throws Exception { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mCipherDecrypt.doFinal(DATA, 0, mInputSize, mOutput); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CollatorPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CollatorPerfTest.java new file mode 100644 index 000000000000..6728e73d0c4b --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/CollatorPerfTest.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2022 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.text.Collator; +import java.text.RuleBasedCollator; +import java.util.Locale; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class CollatorPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + private static final RuleBasedCollator COLLATOR = + (RuleBasedCollator) Collator.getInstance(Locale.US); + + @Test + public void timeCollatorPrimary() { + COLLATOR.setStrength(Collator.PRIMARY); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + COLLATOR.compare("abcde", "abcdf"); + COLLATOR.compare("abcde", "abcde"); + COLLATOR.compare("abcdf", "abcde"); + } + } + + @Test + public void timeCollatorSecondary() { + COLLATOR.setStrength(Collator.SECONDARY); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + COLLATOR.compare("abcdÂ", "abcdÄ"); + COLLATOR.compare("abcdÂ", "abcdÂ"); + COLLATOR.compare("abcdÄ", "abcdÂ"); + } + } + + @Test + public void timeCollatorTertiary() { + COLLATOR.setStrength(Collator.TERTIARY); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + COLLATOR.compare("abcdE", "abcde"); + COLLATOR.compare("abcde", "abcde"); + COLLATOR.compare("abcde", "abcdE"); + } + } + + @Test + public void timeCollatorIdentical() { + COLLATOR.setStrength(Collator.IDENTICAL); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + COLLATOR.compare("abcdȪ", "abcdȫ"); + COLLATOR.compare("abcdȪ", "abcdȪ"); + COLLATOR.compare("abcdȫ", "abcdȪ"); + } + } +} diff --git a/apct-tests/perftests/core/src/android/libcore/regression/CollectionsPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/CollectionsPerfTest.java new file mode 100644 index 000000000000..a89efffcdd1f --- /dev/null +++ b/apct-tests/perftests/core/src/android/libcore/regression/CollectionsPerfTest.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2014 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.libcore.regression; + +import android.perftests.utils.BenchmarkState; +import android.perftests.utils.PerfStatusReporter; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Random; +import java.util.Vector; + +@RunWith(Parameterized.class) +@LargeTest +public class CollectionsPerfTest { + @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + + @Parameters(name = "mArrayListLength({0})") + public static Collection data() { + return Arrays.asList(new Object[][] {{4}, {16}, {64}, {256}, {1024}}); + } + + @Parameterized.Parameter(0) + public int arrayListLength; + + public static Comparator REVERSE = + new Comparator() { + @Override + public int compare(Integer lhs, Integer rhs) { + int lhsAsInt = lhs.intValue(); + int rhsAsInt = rhs.intValue(); + return rhsAsInt < lhsAsInt ? -1 : (lhsAsInt == rhsAsInt ? 0 : 1); + } + }; + + @Test + public void timeSort_arrayList() throws Exception { + List input = buildList(arrayListLength, ArrayList.class); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Collections.sort(input); + } + } + + @Test + public void timeSortWithComparator_arrayList() throws Exception { + List input = buildList(arrayListLength, ArrayList.class); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Collections.sort(input, REVERSE); + } + } + + @Test + public void timeSort_vector() throws Exception { + List input = buildList(arrayListLength, Vector.class); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Collections.sort(input); + } + } + + @Test + public void timeSortWithComparator_vector() throws Exception { + List input = buildList(arrayListLength, Vector.class); + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Collections.sort(input, REVERSE); + } + } + + private static > List buildList( + int arrayListLength, Class listClass) throws Exception { + Random random = new Random(); + random.setSeed(0); + List list = listClass.newInstance(); + for (int i = 0; i < arrayListLength; ++i) { + list.add(random.nextInt()); + } + return list; + } +} -- cgit v1.2.3-59-g8ed1b