Even more libcore benchmark tests.

Test: atest TestName
Change-Id: I547d8347dade1f66164acbfbacd2936fa0664b95
This commit is contained in:
Miguel 2022-04-25 08:49:16 +00:00 committed by Miguel Aranda
parent df27cf8d48
commit 2030cb4041
17 changed files with 2873 additions and 0 deletions

View File

@ -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;
}
}

View File

@ -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.
}
}
}

View File

@ -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);
}
}
}

View File

@ -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<Object[]> 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);
}
}
}

View File

@ -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<Object[]> 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
}
}
}
}

View File

@ -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<Object[]> 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);
}
}
}

View File

@ -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<Object[]> 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);
}
}
}

View File

@ -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<Object[]> 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);
}
}
}

View File

@ -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<Object[]> 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]);
}
}
}
}
}

View File

@ -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<Object[]> 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);
}
}
}

View File

@ -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<Object[]> 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);
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}
}

View File

@ -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
}
}
}
}

View File

@ -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<Object[]> 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<Integer, SecretKey> sKeySizes = new HashMap<Integer, SecretKey>();
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);
}
}
}

View File

@ -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Ȫ");
}
}
}

View File

@ -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<Object[]> data() {
return Arrays.asList(new Object[][] {{4}, {16}, {64}, {256}, {1024}});
}
@Parameterized.Parameter(0)
public int arrayListLength;
public static Comparator<Integer> REVERSE =
new Comparator<Integer>() {
@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<Integer> input = buildList(arrayListLength, ArrayList.class);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
Collections.sort(input);
}
}
@Test
public void timeSortWithComparator_arrayList() throws Exception {
List<Integer> input = buildList(arrayListLength, ArrayList.class);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
Collections.sort(input, REVERSE);
}
}
@Test
public void timeSort_vector() throws Exception {
List<Integer> input = buildList(arrayListLength, Vector.class);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
Collections.sort(input);
}
}
@Test
public void timeSortWithComparator_vector() throws Exception {
List<Integer> input = buildList(arrayListLength, Vector.class);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
Collections.sort(input, REVERSE);
}
}
private static <T extends List<Integer>> List<Integer> buildList(
int arrayListLength, Class<T> listClass) throws Exception {
Random random = new Random();
random.setSeed(0);
List<Integer> list = listClass.newInstance();
for (int i = 0; i < arrayListLength; ++i) {
list.add(random.nextInt());
}
return list;
}
}