aboutsummaryrefslogtreecommitdiff
path: root/benches/api_calls.rs
diff options
context:
space:
mode:
Diffstat (limited to 'benches/api_calls.rs')
-rw-r--r--benches/api_calls.rs128
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]