제 코드에서는 많은 리플렉션 조회를하므로 어떻게 든 개선하려고했습니다. SetFloatField
같은jni로 반사 성능을 향상시킬 수 있습니까?
JNIEXPORT jobject JNICALL
Java_org_orman_mapper_Model_fieldSetFloat(JNIEnv * env, jobject obj, jobject model, jstring field_name, jstring field_type, jfloat value, jclass clazz)
{
const char* utf_string_name = (*env)->GetStringUTFChars (env, field_name, 0);
const char* utf_string_type = (*env)->GetStringUTFChars (env, field_type, 0);
jfieldID id = (*env)->GetFieldID(env, clazz, utf_string_name, utf_string_type);
(*env)->SetFloatField(env, model, id, value);
return model;
}
통화의 intrisics, 그것은 어떤 자바 보안 검사를 건너 않습니다
이 내 JNI의 setter 메소드의 샘플입니다?
나는 성능에 어떤 이득도 느끼지 못했습니다.
나는'GetStringUTFChars'가 지금까지 가장 비싼 기능이 될 것으로 기대합니다. 'jfieldID'를 여기에 캐시 할 수 있습니까? 보안을 무시하고 싶다면'Member.setAccessible (true); '를 호출하면 액세스가 있어도 보안 검사를 빨리 건너 뛸 수 있습니다. –
@PeterLawrey 그게 내가 지금보고있는 것. – kaneda
JNI보다 빠르지 만 최소한의 노력으로 반사 속도를 높일 수있는 방법 중 하나입니다. ;) JVM과 사용 방법에 따라 더 빨라질 수있는 MethodHandles를 볼 수 있습니다. –