diff options
Diffstat (limited to 'benches/api_calls.rs')
-rw-r--r-- | benches/api_calls.rs | 128 |
1 files changed, 106 insertions, 22 deletions
diff --git a/benches/api_calls.rs b/benches/api_calls.rs index 411b536..0ee0351 100644 --- a/benches/api_calls.rs +++ b/benches/api_calls.rs @@ -3,24 +3,28 @@ extern crate test; +use jni_sys::jvalue; use lazy_static::lazy_static; use jni::{ descriptors::Desc, objects::{JClass, JMethodID, JObject, JStaticMethodID, JValue}, - signature::{JavaType, Primitive}, + signature::{Primitive, ReturnType}, sys::jint, InitArgsBuilder, JNIEnv, JNIVersion, JavaVM, }; static CLASS_MATH: &str = "java/lang/Math"; static CLASS_OBJECT: &str = "java/lang/Object"; +static CLASS_LOCAL_DATE_TIME: &str = "java/time/LocalDateTime"; static METHOD_MATH_ABS: &str = "abs"; static METHOD_OBJECT_HASH_CODE: &str = "hashCode"; static METHOD_CTOR: &str = "<init>"; +static METHOD_LOCAL_DATE_TIME_OF: &str = "of"; static SIG_OBJECT_CTOR: &str = "()V"; static SIG_MATH_ABS: &str = "(I)I"; static SIG_OBJECT_HASH_CODE: &str = "()I"; +static SIG_LOCAL_DATE_TIME_OF: &str = "(IIIIIII)Ljava/time/LocalDateTime;"; #[inline(never)] fn native_abs(x: i32) -> i32 { @@ -35,37 +39,81 @@ fn jni_abs_safe(env: &JNIEnv, x: jint) -> jint { v.i().unwrap() } -fn jni_call_static_unchecked<'c, C>( +fn jni_hash_safe(env: &JNIEnv, obj: JObject) -> jint { + let v = env + .call_method(obj, METHOD_OBJECT_HASH_CODE, SIG_OBJECT_HASH_CODE, &[]) + .unwrap(); + v.i().unwrap() +} + +fn jni_local_date_time_of_safe<'e>( + env: &JNIEnv<'e>, + year: jint, + month: jint, + day_of_month: jint, + hour: jint, + minute: jint, + second: jint, + nanosecond: jint, +) -> JObject<'e> { + let v = env + .call_static_method( + CLASS_LOCAL_DATE_TIME, + METHOD_LOCAL_DATE_TIME_OF, + SIG_LOCAL_DATE_TIME_OF, + &[ + year.into(), + month.into(), + day_of_month.into(), + hour.into(), + minute.into(), + second.into(), + nanosecond.into(), + ], + ) + .unwrap(); + v.l().unwrap() +} + +fn jni_int_call_static_unchecked<'c, C>( env: &JNIEnv<'c>, class: C, - method_id: JStaticMethodID<'c>, + method_id: JStaticMethodID, x: jint, ) -> jint where C: Desc<'c, JClass<'c>>, { let x = JValue::from(x); - let ret = JavaType::Primitive(Primitive::Int); + let ret = ReturnType::Primitive(Primitive::Int); let v = env - .call_static_method_unchecked(class, method_id, ret, &[x]) + .call_static_method_unchecked(class, method_id, ret, &[x.into()]) .unwrap(); v.i().unwrap() } -fn jni_hash_safe(env: &JNIEnv, obj: JObject) -> jint { - let v = env - .call_method(obj, METHOD_OBJECT_HASH_CODE, SIG_OBJECT_HASH_CODE, &[]) - .unwrap(); +fn jni_int_call_unchecked<'m, M>(env: &JNIEnv<'m>, obj: JObject<'m>, method_id: M) -> jint +where + M: Desc<'m, JMethodID>, +{ + let ret = ReturnType::Primitive(Primitive::Int); + let v = env.call_method_unchecked(obj, method_id, ret, &[]).unwrap(); v.i().unwrap() } -fn jni_call_unchecked<'m, M>(env: &JNIEnv<'m>, obj: JObject<'m>, method_id: M) -> jint +fn jni_object_call_static_unchecked<'c, C>( + env: &JNIEnv<'c>, + class: C, + method_id: JStaticMethodID, + args: &[jvalue], +) -> JObject<'c> where - M: Desc<'m, JMethodID<'m>>, + C: Desc<'c, JClass<'c>>, { - let ret = JavaType::Primitive(Primitive::Int); - let v = env.call_method_unchecked(obj, method_id, ret, &[]).unwrap(); - v.i().unwrap() + let v = env + .call_static_method_unchecked(class, method_id, ReturnType::Object, args) + .unwrap(); + v.l().unwrap() } #[cfg(test)] @@ -93,36 +141,72 @@ mod tests { } #[bench] - fn jni_call_static_method_safe(b: &mut Bencher) { + fn jni_call_static_abs_method_safe(b: &mut Bencher) { let env = VM.attach_current_thread().unwrap(); b.iter(|| jni_abs_safe(&env, -3)); } #[bench] - fn jni_call_static_method_unchecked_str(b: &mut Bencher) { + fn jni_call_static_abs_method_unchecked_str(b: &mut Bencher) { let env = VM.attach_current_thread().unwrap(); let class = CLASS_MATH; let method_id = env .get_static_method_id(class, METHOD_MATH_ABS, SIG_MATH_ABS) .unwrap(); - b.iter(|| jni_call_static_unchecked(&env, class, method_id, -3)); + b.iter(|| jni_int_call_static_unchecked(&env, class, method_id, -3)); } #[bench] - fn jni_call_static_method_unchecked_jclass(b: &mut Bencher) { + fn jni_call_static_abs_method_unchecked_jclass(b: &mut Bencher) { let env = VM.attach_current_thread().unwrap(); let class: JClass = CLASS_MATH.lookup(&env).unwrap(); let method_id = env .get_static_method_id(class, METHOD_MATH_ABS, SIG_MATH_ABS) .unwrap(); - b.iter(|| jni_call_static_unchecked(&env, class, method_id, -3)); + b.iter(|| jni_int_call_static_unchecked(&env, class, method_id, -3)); + } + + #[bench] + fn jni_call_static_date_time_method_safe(b: &mut Bencher) { + let env = VM.attach_current_thread().unwrap(); + b.iter(|| { + let obj = jni_local_date_time_of_safe(&env, 1, 1, 1, 1, 1, 1, 1); + env.delete_local_ref(obj).unwrap(); + }); + } + + #[bench] + fn jni_call_static_date_time_method_unchecked_jclass(b: &mut Bencher) { + let env = VM.attach_current_thread().unwrap(); + let class: JClass = CLASS_LOCAL_DATE_TIME.lookup(&env).unwrap(); + let method_id = env + .get_static_method_id(class, METHOD_LOCAL_DATE_TIME_OF, SIG_LOCAL_DATE_TIME_OF) + .unwrap(); + + b.iter(|| { + let obj = jni_object_call_static_unchecked( + &env, + class, + method_id, + &[ + JValue::Int(1).into(), + JValue::Int(1).into(), + JValue::Int(1).into(), + JValue::Int(1).into(), + JValue::Int(1).into(), + JValue::Int(1).into(), + JValue::Int(1).into(), + ], + ); + env.delete_local_ref(obj).unwrap(); + }); } #[bench] - fn jni_call_object_method_safe(b: &mut Bencher) { + fn jni_call_object_hash_method_safe(b: &mut Bencher) { let env = VM.attach_current_thread().unwrap(); let s = env.new_string("").unwrap(); let obj = black_box(JObject::from(s)); @@ -131,7 +215,7 @@ mod tests { } #[bench] - fn jni_call_object_method_unchecked(b: &mut Bencher) { + fn jni_call_object_hash_method_unchecked(b: &mut Bencher) { let env = VM.attach_current_thread().unwrap(); let s = env.new_string("").unwrap(); let obj = black_box(JObject::from(s)); @@ -139,7 +223,7 @@ mod tests { .get_method_id(obj, METHOD_OBJECT_HASH_CODE, SIG_OBJECT_HASH_CODE) .unwrap(); - b.iter(|| jni_call_unchecked(&env, obj, method_id)); + b.iter(|| jni_int_call_unchecked(&env, obj, method_id)); } #[bench] |