diff options
author | Igor Murashkin <iam@google.com> | 2016-09-15 14:58:24 -0700 |
---|---|---|
committer | Igor Murashkin <iam@google.com> | 2016-09-23 14:52:57 -0700 |
commit | efab71a017c44850bda9719567683b8c0b3a6f60 (patch) | |
tree | a283a6518c15e383ddbbb899e816d3d16fa75a0a | |
parent | 3407235b8e113ae1c5168dc49c4e7f3fb56ed1c9 (diff) |
benchmarks: Add timings for @FastNative/@CriticalNative
Bug: 31399521
Bug: 31712552
Test: vogar --benchmark libcore/benchmarks/src/benchmarks/regression/NativeMethodBenchmark.java
Change-Id: I704686c97946907b914ad7e44882e4ddbd94a4ff
3 files changed, 168 insertions, 30 deletions
diff --git a/benchmarks/src/benchmarks/regression/NativeMethodBenchmark.java b/benchmarks/src/benchmarks/regression/NativeMethodBenchmark.java index c30ea08333..dbb630829c 100644 --- a/benchmarks/src/benchmarks/regression/NativeMethodBenchmark.java +++ b/benchmarks/src/benchmarks/regression/NativeMethodBenchmark.java @@ -32,16 +32,38 @@ public class NativeMethodBenchmark { } } - public void time_emptyJniStaticMethod0(int reps) throws Exception { + + public void time_emptyJniMethod0(int reps) throws Exception { + NativeTestTarget n = new NativeTestTarget(); for (int i = 0; i < reps; ++i) { - NativeTestTarget.emptyJniStaticMethod0(); + n.emptyJniMethod0(); } } - public void time_emptyJniMethod0(int reps) throws Exception { + public void time_emptyJniMethod6(int reps) throws Exception { + int a = -1; + int b = 0; NativeTestTarget n = new NativeTestTarget(); for (int i = 0; i < reps; ++i) { - n.emptyJniMethod0(); + n.emptyJniMethod6(a, b, 1, 2, 3, i); + } + } + + public void time_emptyJniMethod6L(int reps) throws Exception { + NativeTestTarget n = new NativeTestTarget(); + for (int i = 0; i < reps; ++i) { + n.emptyJniMethod6L(null, null, null, null, null, null); + } + } + + public void time_emptyJniStaticMethod6L(int reps) throws Exception { + for (int i = 0; i < reps; ++i) { + NativeTestTarget.emptyJniStaticMethod6L(null, null, null, null, null, null); + } + } + public void time_emptyJniStaticMethod0(int reps) throws Exception { + for (int i = 0; i < reps; ++i) { + NativeTestTarget.emptyJniStaticMethod0(); } } @@ -53,26 +75,59 @@ public class NativeMethodBenchmark { } } - public void time_emptyJniMethod6(int reps) throws Exception { + public void time_emptyJniMethod0_Fast(int reps) throws Exception { + NativeTestTarget n = new NativeTestTarget(); + for (int i = 0; i < reps; ++i) { + n.emptyJniMethod0_Fast(); + } + } + + public void time_emptyJniMethod6_Fast(int reps) throws Exception { int a = -1; int b = 0; NativeTestTarget n = new NativeTestTarget(); for (int i = 0; i < reps; ++i) { - n.emptyJniMethod6(a, b, 1, 2, 3, i); + n.emptyJniMethod6_Fast(a, b, 1, 2, 3, i); } } - public void time_emptyJniStaticMethod6L(int reps) throws Exception { + public void time_emptyJniMethod6L_Fast(int reps) throws Exception { + NativeTestTarget n = new NativeTestTarget(); for (int i = 0; i < reps; ++i) { - NativeTestTarget.emptyJniStaticMethod6L(null, null, null, null, null, null); + n.emptyJniMethod6L_Fast(null, null, null, null, null, null); } } - public void time_emptyJniMethod6L(int reps) throws Exception { - NativeTestTarget n = new NativeTestTarget(); + public void time_emptyJniStaticMethod6L_Fast(int reps) throws Exception { for (int i = 0; i < reps; ++i) { - n.emptyJniMethod6L(null, null, null, null, null, null); + NativeTestTarget.emptyJniStaticMethod6L_Fast(null, null, null, null, null, null); + } + } + public void time_emptyJniStaticMethod0_Fast(int reps) throws Exception { + for (int i = 0; i < reps; ++i) { + NativeTestTarget.emptyJniStaticMethod0_Fast(); } } + public void time_emptyJniStaticMethod6_Fast(int reps) throws Exception { + int a = -1; + int b = 0; + for (int i = 0; i < reps; ++i) { + NativeTestTarget.emptyJniStaticMethod6_Fast(a, b, 1, 2, 3, i); + } + } + + public void time_emptyJniStaticMethod0_Critical(int reps) throws Exception { + for (int i = 0; i < reps; ++i) { + NativeTestTarget.emptyJniStaticMethod0_Critical(); + } + } + + public void time_emptyJniStaticMethod6_Critical(int reps) throws Exception { + int a = -1; + int b = 0; + for (int i = 0; i < reps; ++i) { + NativeTestTarget.emptyJniStaticMethod6_Critical(a, b, 1, 2, 3, i); + } + } } diff --git a/dalvik/src/main/java/org/apache/harmony/dalvik/NativeTestTarget.java b/dalvik/src/main/java/org/apache/harmony/dalvik/NativeTestTarget.java index 5daf6a02fc..a9efabe880 100644 --- a/dalvik/src/main/java/org/apache/harmony/dalvik/NativeTestTarget.java +++ b/dalvik/src/main/java/org/apache/harmony/dalvik/NativeTestTarget.java @@ -16,6 +16,9 @@ package org.apache.harmony.dalvik; +import dalvik.annotation.optimization.CriticalNative; +import dalvik.annotation.optimization.FastNative; + /** * Methods used to test calling into native code. The methods in this * class are all effectively no-ops and may be used to test the mechanisms @@ -25,16 +28,42 @@ public final class NativeTestTarget { public NativeTestTarget() { } - public static native synchronized void emptyJniStaticSynchronizedMethod0(); + /** + * This is used to benchmark dalvik's inline natives. + */ + public static void emptyInlineMethod() { + } + + /** + * This is used to benchmark dalvik's inline natives. + */ + public static native void emptyInternalStaticMethod(); + // Synchronized methods. Test normal JNI only. + public static native synchronized void emptyJniStaticSynchronizedMethod0(); public native synchronized void emptyJniSynchronizedMethod0(); + // Static methods without object parameters. Test all optimization combinations. + + // Normal native. public static native void emptyJniStaticMethod0(); + // Normal native. + public static native void emptyJniStaticMethod6(int a, int b, int c, int d, int e, int f); - public native void emptyJniMethod0(); + @FastNative + public static native void emptyJniStaticMethod0_Fast(); + @FastNative + public static native void emptyJniStaticMethod6_Fast(int a, int b, int c, int d, int e, int f); - public static native void emptyJniStaticMethod6(int a, int b, int c, int d, int e, int f); + @CriticalNative + public static native void emptyJniStaticMethod0_Critical(); + @CriticalNative + public static native void emptyJniStaticMethod6_Critical(int a, int b, int c, int d, int e, int f); + // Instance methods or methods with object parameters. Test {Normal, @FastNative} combinations. + // Normal native. + public native void emptyJniMethod0(); + // Normal native. public native void emptyJniMethod6(int a, int b, int c, int d, int e, int f); /** @@ -43,20 +72,30 @@ public final class NativeTestTarget { * parsing the signature. All six values should be null * references. */ + // Normal native. public static native void emptyJniStaticMethod6L(String a, String[] b, int[][] c, Object d, Object[] e, Object[][][][] f); + // Normal native. public native void emptyJniMethod6L(String a, String[] b, int[][] c, Object d, Object[] e, Object[][][][] f); - /** - * This is used to benchmark dalvik's inline natives. - */ - public static void emptyInlineMethod() { - } + @FastNative + public native void emptyJniMethod0_Fast(); + @FastNative + public native void emptyJniMethod6_Fast(int a, int b, int c, int d, int e, int f); /** - * This is used to benchmark dalvik's inline natives. + * This is an empty native static method with six args, hooked up + * using JNI. These have more complex args to show the cost of + * parsing the signature. All six values should be null + * references. */ - public static native void emptyInternalStaticMethod(); + @FastNative + public static native void emptyJniStaticMethod6L_Fast(String a, String[] b, + int[][] c, Object d, Object[] e, Object[][][][] f); + + @FastNative + public native void emptyJniMethod6L_Fast(String a, String[] b, + int[][] c, Object d, Object[] e, Object[][][][] f); } diff --git a/dalvik/src/main/native/org_apache_harmony_dalvik_NativeTestTarget.cpp b/dalvik/src/main/native/org_apache_harmony_dalvik_NativeTestTarget.cpp index 52f22a80ab..03ce2a627c 100644 --- a/dalvik/src/main/native/org_apache_harmony_dalvik_NativeTestTarget.cpp +++ b/dalvik/src/main/native/org_apache_harmony_dalvik_NativeTestTarget.cpp @@ -14,30 +14,74 @@ * limitations under the License. */ +/* + * AUTOMATICALLY GENERATED FROM art/tools/mako-source-generator/...../org_apache_harmony_dalvik_NativeTestTarget.cpp.mako + * + * !!! DO NOT EDIT DIRECTLY !!! + * + */ + #define LOG_TAG "NativeTestTarget" #include "JNIHelp.h" #include "JniConstants.h" +static void NativeTestTarget_emptyJniStaticSynchronizedMethod0(JNIEnv*, jclass) { } +static void NativeTestTarget_emptyJniSynchronizedMethod0(JNIEnv*, jclass) { } + +static JNINativeMethod gMethods_NormalOnly[] = { + NATIVE_METHOD(NativeTestTarget, emptyJniStaticSynchronizedMethod0, "()V"), + NATIVE_METHOD(NativeTestTarget, emptyJniSynchronizedMethod0, "()V"), +}; + + static void NativeTestTarget_emptyJniMethod0(JNIEnv*, jobject) { } -static void NativeTestTarget_emptyJniMethod6(JNIEnv*, jclass, int, int, int, int, int, int) { } -static void NativeTestTarget_emptyJniMethod6L(JNIEnv*, jclass, jobject, jarray, jarray, jobject, jarray, jarray) { } +static void NativeTestTarget_emptyJniMethod6(JNIEnv*, jobject, int, int, int, int, int, int) { } +static void NativeTestTarget_emptyJniMethod6L(JNIEnv*, jobject, jobject, jarray, jarray, jobject, jarray, jarray) { } +static void NativeTestTarget_emptyJniStaticMethod6L(JNIEnv*, jclass, jobject, jarray, jarray, jobject, jarray, jarray) { } + static void NativeTestTarget_emptyJniStaticMethod0(JNIEnv*, jclass) { } static void NativeTestTarget_emptyJniStaticMethod6(JNIEnv*, jclass, int, int, int, int, int, int) { } -static void NativeTestTarget_emptyJniStaticMethod6L(JNIEnv*, jclass, jobject, jarray, jarray, jobject, jarray, jarray) { } -static void NativeTestTarget_emptyJniStaticSynchronizedMethod0(JNIEnv*, jclass) { } -static void NativeTestTarget_emptyJniSynchronizedMethod0(JNIEnv*, jclass) { } static JNINativeMethod gMethods[] = { NATIVE_METHOD(NativeTestTarget, emptyJniMethod0, "()V"), NATIVE_METHOD(NativeTestTarget, emptyJniMethod6, "(IIIIII)V"), NATIVE_METHOD(NativeTestTarget, emptyJniMethod6L, "(Ljava/lang/String;[Ljava/lang/String;[[ILjava/lang/Object;[Ljava/lang/Object;[[[[Ljava/lang/Object;)V"), + NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod6L, "(Ljava/lang/String;[Ljava/lang/String;[[ILjava/lang/Object;[Ljava/lang/Object;[[[[Ljava/lang/Object;)V"), NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod0, "()V"), NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod6, "(IIIIII)V"), - NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod6L, "(Ljava/lang/String;[Ljava/lang/String;[[ILjava/lang/Object;[Ljava/lang/Object;[[[[Ljava/lang/Object;)V"), - NATIVE_METHOD(NativeTestTarget, emptyJniStaticSynchronizedMethod0, "()V"), - NATIVE_METHOD(NativeTestTarget, emptyJniSynchronizedMethod0, "()V"), +}; + +static void NativeTestTarget_emptyJniMethod0_Fast(JNIEnv*, jobject) { } +static void NativeTestTarget_emptyJniMethod6_Fast(JNIEnv*, jobject, int, int, int, int, int, int) { } +static void NativeTestTarget_emptyJniMethod6L_Fast(JNIEnv*, jobject, jobject, jarray, jarray, jobject, jarray, jarray) { } +static void NativeTestTarget_emptyJniStaticMethod6L_Fast(JNIEnv*, jclass, jobject, jarray, jarray, jobject, jarray, jarray) { } + +static void NativeTestTarget_emptyJniStaticMethod0_Fast(JNIEnv*, jclass) { } +static void NativeTestTarget_emptyJniStaticMethod6_Fast(JNIEnv*, jclass, int, int, int, int, int, int) { } + +static JNINativeMethod gMethods_Fast[] = { + NATIVE_METHOD(NativeTestTarget, emptyJniMethod0_Fast, "()V"), + NATIVE_METHOD(NativeTestTarget, emptyJniMethod6_Fast, "(IIIIII)V"), + NATIVE_METHOD(NativeTestTarget, emptyJniMethod6L_Fast, "(Ljava/lang/String;[Ljava/lang/String;[[ILjava/lang/Object;[Ljava/lang/Object;[[[[Ljava/lang/Object;)V"), + NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod6L_Fast, "(Ljava/lang/String;[Ljava/lang/String;[[ILjava/lang/Object;[Ljava/lang/Object;[[[[Ljava/lang/Object;)V"), + NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod0_Fast, "()V"), + NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod6_Fast, "(IIIIII)V"), +}; + + +static void NativeTestTarget_emptyJniStaticMethod0_Critical() { } +static void NativeTestTarget_emptyJniStaticMethod6_Critical( int, int, int, int, int, int) { } + +static JNINativeMethod gMethods_Critical[] = { + NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod0_Critical, "()V"), + NATIVE_METHOD(NativeTestTarget, emptyJniStaticMethod6_Critical, "(IIIIII)V"), }; int register_org_apache_harmony_dalvik_NativeTestTarget(JNIEnv* env) { - return jniRegisterNativeMethods(env, "org/apache/harmony/dalvik/NativeTestTarget", gMethods, NELEM(gMethods)); + jniRegisterNativeMethods(env, "org/apache/harmony/dalvik/NativeTestTarget", gMethods_NormalOnly, NELEM(gMethods_NormalOnly)); + jniRegisterNativeMethods(env, "org/apache/harmony/dalvik/NativeTestTarget", gMethods, NELEM(gMethods)); + jniRegisterNativeMethods(env, "org/apache/harmony/dalvik/NativeTestTarget", gMethods_Fast, NELEM(gMethods_Fast)); + jniRegisterNativeMethods(env, "org/apache/harmony/dalvik/NativeTestTarget", gMethods_Critical, NELEM(gMethods_Critical)); + + return 0; } |