diff options
| author | 2015-09-04 16:38:55 -0700 | |
|---|---|---|
| committer | 2015-09-11 12:56:47 -0700 | |
| commit | 4b1e0f417572eab92f1b8e2f921d2aba8a9fbd8c (patch) | |
| tree | 28484fc12197cacd8735b602dec37b29cd8061da | |
| parent | 48269a62abcc2e9e82c9443027f871eede2f3505 (diff) | |
Add benchmark for ScopedPrimitiveArray
TODO: Make this into a caliper benchmark.
Bug: 19664826
Change-Id: If1484a68cc62603f1d216b1662ca55cceac1d619
| -rwxr-xr-x | test/998-scoped-primitive-array/check | 22 | ||||
| -rw-r--r-- | test/998-scoped-primitive-array/expected.txt | 1 | ||||
| -rw-r--r-- | test/998-scoped-primitive-array/info.txt | 1 | ||||
| -rw-r--r-- | test/998-scoped-primitive-array/scoped_primitive_array.cc | 66 | ||||
| -rw-r--r-- | test/998-scoped-primitive-array/src/Main.java | 85 | ||||
| -rw-r--r-- | test/Android.libarttest.mk | 3 |
6 files changed, 177 insertions, 1 deletions
diff --git a/test/998-scoped-primitive-array/check b/test/998-scoped-primitive-array/check new file mode 100755 index 0000000000..842bdc6ae8 --- /dev/null +++ b/test/998-scoped-primitive-array/check @@ -0,0 +1,22 @@ +#!/bin/bash +# +# 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. + +# Check that the string "error" isn't present +if grep error "$2"; then + exit 1 +else + exit 0 +fi diff --git a/test/998-scoped-primitive-array/expected.txt b/test/998-scoped-primitive-array/expected.txt new file mode 100644 index 0000000000..a965a70ed4 --- /dev/null +++ b/test/998-scoped-primitive-array/expected.txt @@ -0,0 +1 @@ +Done diff --git a/test/998-scoped-primitive-array/info.txt b/test/998-scoped-primitive-array/info.txt new file mode 100644 index 0000000000..93abb7ce8f --- /dev/null +++ b/test/998-scoped-primitive-array/info.txt @@ -0,0 +1 @@ +Tests for measuring performance of ScopedPrimitiveArray. diff --git a/test/998-scoped-primitive-array/scoped_primitive_array.cc b/test/998-scoped-primitive-array/scoped_primitive_array.cc new file mode 100644 index 0000000000..c224a06313 --- /dev/null +++ b/test/998-scoped-primitive-array/scoped_primitive_array.cc @@ -0,0 +1,66 @@ +/* + * 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. + */ + +#include "jni.h" +#include "ScopedPrimitiveArray.h" + +extern "C" JNIEXPORT jlong JNICALL Java_Main_measureByteArray(JNIEnv* env, + jclass, + jlong reps, + jbyteArray arr) { + jlong ret = 0; + for (jlong i = 0; i < reps; ++i) { + ScopedByteArrayRO sc(env, arr); + ret += sc[0] + sc[sc.size() - 1]; + } + return ret; +} + +extern "C" JNIEXPORT jlong JNICALL Java_Main_measureShortArray(JNIEnv* env, + jclass, + jlong reps, + jshortArray arr) { + jlong ret = 0; + for (jlong i = 0; i < reps; ++i) { + ScopedShortArrayRO sc(env, arr); + ret += sc[0] + sc[sc.size() - 1]; + } + return ret; +} + +extern "C" JNIEXPORT jlong JNICALL Java_Main_measureIntArray(JNIEnv* env, + jclass, + jlong reps, + jintArray arr) { + jlong ret = 0; + for (jlong i = 0; i < reps; ++i) { + ScopedIntArrayRO sc(env, arr); + ret += sc[0] + sc[sc.size() - 1]; + } + return ret; +} + +extern "C" JNIEXPORT jlong JNICALL Java_Main_measureLongArray(JNIEnv* env, + jclass, + jlong reps, + jlongArray arr) { + jlong ret = 0; + for (jlong i = 0; i < reps; ++i) { + ScopedLongArrayRO sc(env, arr); + ret += sc[0] + sc[sc.size() - 1]; + } + return ret; +} diff --git a/test/998-scoped-primitive-array/src/Main.java b/test/998-scoped-primitive-array/src/Main.java new file mode 100644 index 0000000000..630e0dc1b6 --- /dev/null +++ b/test/998-scoped-primitive-array/src/Main.java @@ -0,0 +1,85 @@ +/* + * 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. + */ + +public class Main { + public Main() {} + + // Measure adds the first and last element of the array by using ScopedPrimitiveArray. + static native long measureByteArray(long reps, byte[] arr); + static native long measureShortArray(long reps, short[] arr); + static native long measureIntArray(long reps, int[] arr); + static native long measureLongArray(long reps, long[] arr); + + static void checkEq(long expected, long value) { + if (expected != value) { + System.out.println("error: Expected " + expected + " but got " + value); + } + } + + static void runPerfTest(long reps) { + for (int length = 1; length <= 8192; length *= 8) { + byte[] bytes = new byte[length]; + bytes[0] = 1; + bytes[length - 1] = 2; + short[] shorts = new short[length]; + shorts[0] = 1; + shorts[length - 1] = 2; + int[] ints = new int[length]; + ints[0] = 1; + ints[length - 1] = 2; + long[] longs = new long[length]; + longs[0] = 1; + longs[length - 1] = 2; + long value = 0; + long elapsed = 0; + long start = 0; + + start = System.nanoTime(); + value = measureByteArray(reps, bytes); + elapsed = System.nanoTime() - start; + System.out.println("Byte length=" + length + " ns/op=" + (double) elapsed / reps); + checkEq(value, reps * (long) (bytes[0] + bytes[length - 1])); + + start = System.nanoTime(); + value = measureShortArray(reps, shorts); + elapsed = System.nanoTime() - start; + System.out.println("Short length=" + length + " ns/op=" + (double) elapsed / reps); + checkEq(value, reps * (long) (shorts[0] + shorts[length - 1])); + + start = System.nanoTime(); + value = measureIntArray(reps, ints); + elapsed = System.nanoTime() - start; + System.out.println("Int length=" + length + " ns/op=" + (double) elapsed / reps); + checkEq(value, reps * (ints[0] + ints[length - 1])); + + start = System.nanoTime(); + value = measureLongArray(reps, longs); + elapsed = System.nanoTime() - start; + System.out.println("Long length=" + length + " ns/op=" + (double) elapsed / reps); + checkEq(value, reps * (longs[0] + longs[length - 1])); + } + } + + public static void main(String[] args) { + System.loadLibrary(args[0]); + long iterations = 2000000; + if (args.length > 1) { + iterations = Long.parseLong(args[1], 10); + } + runPerfTest(iterations); + System.out.println("Done"); + } +} diff --git a/test/Android.libarttest.mk b/test/Android.libarttest.mk index c3d157655c..6d9d7c3cf6 100644 --- a/test/Android.libarttest.mk +++ b/test/Android.libarttest.mk @@ -38,6 +38,7 @@ LIBARTTEST_COMMON_SRC_FILES := \ 461-get-reference-vreg/get_reference_vreg_jni.cc \ 466-get-live-vreg/get_live_vreg_jni.cc \ 497-inlining-and-class-loader/clear_dex_cache.cc \ + 998-scoped-primitive-array/scoped_primitive_array.cc \ 999-jni-perf/perf-jni.cc ART_TARGET_LIBARTTEST_$(ART_PHONY_TEST_TARGET_SUFFIX) += $(ART_TARGET_TEST_OUT)/$(TARGET_ARCH)/libarttest.so @@ -72,7 +73,7 @@ define build-libarttest LOCAL_MODULE_TAGS := tests endif LOCAL_SRC_FILES := $(LIBARTTEST_COMMON_SRC_FILES) - LOCAL_SHARED_LIBRARIES += libart$$(suffix) libbacktrace + LOCAL_SHARED_LIBRARIES += libart$$(suffix) libbacktrace libnativehelper LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.libarttest.mk |