| 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..920b395659025c4784a774439237fb645bcb4831 100644
|
| --- a/base/android/jni_android_unittest.cc
|
| +++ b/base/android/jni_android_unittest.cc
|
| @@ -5,6 +5,7 @@
|
| #include "base/android/jni_android.h"
|
|
|
| #include "base/at_exit.h"
|
| +#include "base/logging.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace base {
|
| @@ -90,5 +91,51 @@ TEST_F(JNIAndroidTest, GetMethodIDFromClassNameCaching) {
|
| EXPECT_EQ(g_last_method_id, id3);
|
| }
|
|
|
| +namespace {
|
| +
|
| +base::subtle::AtomicWord g_atomic_id = 0;
|
| +int LazyMethodIDCall(JNIEnv* env, jclass clazz, int p) {
|
| + jmethodID id = base::android::MethodID::LazyGet<
|
| + base::android::MethodID::TYPE_STATIC>(
|
| + env, clazz,
|
| + "abs",
|
| + "(I)I",
|
| + &g_atomic_id);
|
| +
|
| + return env->CallStaticIntMethod(clazz, id, p);
|
| +}
|
| +
|
| +int MethodIDCall(JNIEnv* env, jclass clazz, jmethodID id, int p) {
|
| + return env->CallStaticIntMethod(clazz, id, p);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +TEST(JNIAndroidMicrobenchmark, MethodId) {
|
| + JNIEnv* env = AttachCurrentThread();
|
| + ScopedJavaLocalRef<jclass> clazz(GetClass(env, "java/lang/Math"));
|
| + base::Time start_lazy = base::Time::Now();
|
| + int o = 0;
|
| + for (int i = 0; i < 1024; ++i)
|
| + o += LazyMethodIDCall(env, clazz.obj(), i);
|
| + base::Time end_lazy = base::Time::Now();
|
| +
|
| + jmethodID id = reinterpret_cast<jmethodID>(g_atomic_id);
|
| + base::Time start = base::Time::Now();
|
| + for (int i = 0; i < 1024; ++i)
|
| + o += MethodIDCall(env, clazz.obj(), id, i);
|
| + base::Time end = base::Time::Now();
|
| +
|
| + // On a Galaxy Nexus, results were in the range of:
|
| + // JNI LazyMethodIDCall (us) 1984
|
| + // JNI MethodIDCall (us) 1861
|
| + LOG(ERROR) << "JNI LazyMethodIDCall (us) " <<
|
| + base::TimeDelta(end_lazy - start_lazy).InMicroseconds();
|
| + LOG(ERROR) << "JNI MethodIDCall (us) " <<
|
| + base::TimeDelta(end - start).InMicroseconds();
|
| + LOG(ERROR) << "JNI " << o;
|
| +}
|
| +
|
| +
|
| } // namespace android
|
| } // namespace base
|
|
|