JVM函数调用的性能与从本机方法返回的性能?

JVM函数调用的性能与从本机方法返回的性能?,jvm,java-native-interface,Jvm,Java Native Interface,比如说,我们有一个本机循环,必须不时调用JVM对象上的某个登录: class usesnactive{ void hangle(){…} void循环(){ while(true){ if(捐赠的()){ 句柄(); } } } 本机布尔捐赠(); } 与直接从本机代码调用handle()相比,它的性能如何: JNIEXPORT void JNICALL Java_usesnactive_doNative(JNIEnv*env,jobject实例) { jclass类=(*env)->Find

比如说,我们有一个本机循环,必须不时调用JVM对象上的某个登录:

class usesnactive{
void hangle(){…}
void循环(){
while(true){
if(捐赠的()){
句柄();
}
}
}
本机布尔捐赠();
}
与直接从本机代码调用
handle()
相比,它的性能如何:

JNIEXPORT void JNICALL
Java_usesnactive_doNative(JNIEnv*env,jobject实例)
{
jclass类=(*env)->FindClass(env,“usesnactive”);
jmethodID方法=(*env)->GetMethodID(env,类,“handle”,“V”);
//循环已从Java移动到本机
对于(;;){
如果(条件){
(*env)->CallVoidMethod(env,实例,方法);
}
}
}

一些JVM支持streamlined。在这种情况下,如果doNative()方法回答了or的限制,则第一种方法(无C-to-Java调用)的性能会更好

另一方面,如上@Holger所述,条件的计算可能会对结果产生更大的影响


最后,@EJP关于重用FindClass()和GetMethodID()的结果的评论非常重要。这些调用非常慢,不应该在循环中执行。

太可怕了。每次在循环中查找类和方法。不要这样做。应该将两个查找操作移出循环。然后,性能可能与第一个变体相同。在任何一种情况下,每次迭代都会将上下文从本机来回切换到Java。如果
条件
经常计算为
false
,则可能会有差异。请更新代码。我这样做是为了尽可能地简化事情,在现实世界中,这一切发生得更早,在JNI_OnLoad()中,但我感谢您的评论。请注意,这些特殊的JNI方法不会自动发生。在艺术上,我们使用注释。其他JVM需要不同的方法来标记它们。