Index: base/android/jni_android_unittest.cc |
diff --git a/base/android/jni_android_unittest.cc b/base/android/jni_android_unittest.cc |
index abecad778b47c72830d1e0a3345f6cf7c1d05140..79006a50cfb9caef6d850f6ca2961c4468a08380 100644 |
--- a/base/android/jni_android_unittest.cc |
+++ b/base/android/jni_android_unittest.cc |
@@ -33,6 +33,24 @@ jmethodID GetMethodIDWrapper(JNIEnv* env, jclass clazz, const char* method, |
return g_last_method_id; |
} |
+ |
+static jmethodID g_MTCall = 0; |
+jobject MTCall(JNIEnv* env, jclass clazz, int p) { |
+ base::android::LazyMethodID::Get< |
+ base::android::LazyMethodID::METHODTYPE_STATIC, |
+ base::android::LazyMethodID::EXCEPTIONCHECK_NO>( |
+ env, clazz, |
+ "valueOf", |
+ "(I)Ljava/lang/String;", |
+ &g_MTCall); |
+ |
+ return env->CallStaticObjectMethod(clazz, g_MTCall, p); |
+} |
+ |
+jobject NonMTCall(JNIEnv* env, jclass clazz, int p) { |
+ return env->CallStaticObjectMethod(clazz, g_MTCall, p); |
+} |
+ |
} // namespace |
class JNIAndroidTest : public testing::Test { |
@@ -90,5 +108,24 @@ TEST_F(JNIAndroidTest, GetMethodIDFromClassNameCaching) { |
EXPECT_EQ(g_last_method_id, id3); |
} |
+TEST(JNIAndroidMicrobenchmark, JNIWithLock) { |
+ JNIEnv* env = AttachCurrentThread(); |
+ ScopedJavaLocalRef<jclass> clazz(GetClass(env, "java/lang/String")); |
+ base::Time start_mt = base::Time::Now(); |
+ for (int i = 0; i < 1024; ++i) |
+ ScopedJavaLocalRef<jobject> o(env, MTCall(env, clazz.obj(), i)); |
+ base::Time end_mt = base::Time::Now(); |
+ |
+ base::Time start_non_mt = base::Time::Now(); |
+ for (int i = 0; i < 1024; ++i) |
+ ScopedJavaLocalRef<jobject> o(env, NonMTCall(env, clazz.obj(), i)); |
+ base::Time end_non_mt = base::Time::Now(); |
+ |
+ LOG(ERROR) << "JNI MT" << |
+ base::TimeDelta(start_mt - end_mt).InMicroseconds(); |
+ LOG(ERROR) << "JNI Non-MT" << |
+ base::TimeDelta(start_non_mt - end_non_mt).InMicroseconds(); |
+} |
+ |
} // namespace android |
} // namespace base |