2012-09-18 4 views
2

제 코드에서는 많은 리플렉션 조회를하므로 어떻게 든 개선하려고했습니다. 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 메소드의 샘플입니다?

나는 성능에 어떤 이득도 느끼지 못했습니다.

+0

나는'GetStringUTFChars'가 지금까지 가장 비싼 기능이 될 것으로 기대합니다. 'jfieldID'를 여기에 캐시 할 수 있습니까? 보안을 무시하고 싶다면'Member.setAccessible (true); '를 호출하면 액세스가 있어도 보안 검사를 빨리 건너 뛸 수 있습니다. –

+0

@PeterLawrey 그게 내가 지금보고있는 것. – kaneda

+0

JNI보다 빠르지 만 최소한의 노력으로 반사 속도를 높일 수있는 방법 중 하나입니다. ;) JVM과 사용 방법에 따라 더 빨라질 수있는 MethodHandles를 볼 수 있습니다. –

답변

6

jni로 반사 성능을 향상시킬 수 있습니까?

아마도 조금 있습니다. 그러나 "원치 않는"액세스 검사를 제거 할 수는 있지만 개체의 내부에 액세스하기 위해 JNI 호출을해야한다는 사실 때문에 일부는 손실됩니다. 대조적으로, 리플렉션 메서드 및 호출 시퀀스의 구현은 일반 JNI 메서드에서 사용할 수없는 방식으로 최적화 될 수 있습니다.

(예를 들어, 플랫폼 독립적 인 JNI API를 사용하는 대신 관련 데이터 구조에 직접 액세스하도록 구현 될 수도 있고 JIT 컴파일러가 네이티브 메소드 호출을 특수한 경우로 "내장"원시 메소드로 처리 할 수도 있습니다 ... 그리고 빠른 호출 순서를 사용합니다.이 모든 가상입니다 ...하지만, 일부의 JVM에이 몇 가지 핵심적인 방법의 기본 구현이 빠른을 만들기 위해 특별 대우를 부여하고 있습니다.)


하지만 내를 조언은 반사 코드를 정규 비 반사 자바 코퍼로 대체하면 훨씬 더 나은 성능을 얻을 수 있다는 것이다. 손으로 직접 작성한 코드, 소스로 생성 된 코드, 컴파일 된 코드 또는 바이트 코드로 생성 된 코드 등이 있습니다. 일단 바이트 코드가 있으면 JIT 컴파일러는 리플렉션 또는 JNI를 사용하는 것보다 훨씬 빠른 최적화 된 네이티브 코드를 생성 할 수 있습니다.

그래서 JNI 코드 (및 관련 문제)로 리플렉션을 대체하는 대신 순수 바이트 코드를 사용하는 것으로 대체하십시오.

+0

런타임시 바이트 코드 생성을 의미합니까? 나는 그것을 해결책이라고 말한 기사를 읽었지 만 구현하기가 어려웠다. 내가 바이트 코드 조작으로 필드를 설정할 수 있다면 나는 그것에 내기를 걸 것이다. – kaneda

+0

나는 Stephen과 동의한다. JNI에서이 코드를 작성할 이유가 전혀 없습니다. 약 4 줄의 Java 코드에서이 작업을 수행 할 수 있습니다. – EJP

+1

응용 프로그램의 특성에 따라 컴파일 타임,로드 시간 또는 런타임에서 생성할지 여부가 결정됩니다. 다이렉트 바이트 코드 생성이 너무 어려울 경우 다른 대안을 고려하십시오. –

관련 문제