Even more libcore benchmark tests.
Test: atest TestName Change-Id: I547d8347dade1f66164acbfbacd2936fa0664b95
This commit is contained in:
parent
df27cf8d48
commit
2030cb4041
@ -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;
|
||||
}
|
||||
}
|
@ -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.
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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Ȫ");
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user