JVM函数调用与从本机方法返回的性能?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM函数调用与从本机方法返回的性能?相关的知识,希望对你有一定的参考价值。
比如说,我们有一个本机循环,必须不时地调用JVM对象上的一些登录:
class UsesNative {
void hangle() {...}
void loop() {
while (true) {
if (doNative()) {
handle();
}
}
}
native boolean doNative();
}
与直接从本机代码调用handle()
相比,它的性能如何:
JNIEXPORT void JNICALL
Java_UsesNative_doNative(JNIEnv *env, jobject instance)
{
jclass class = (*env)->FindClass(env, "UsesNative");
jmethodID method = (*env)->GetMethodID(env, class, "handle", "()V");
// Loop has moved from Java to native
for (;;) {
if (condition) {
(*env)->CallVoidMethod(env, instance, method);
}
}
}
答案
一些JVM支持简化的fast JNI calls。在这种情况下,如果doNative()方法回答了FastNative或CriticalNative的限制,那么第一种方式(没有C-to-Java调用)将表现得更好。
另一方面,正如上面提到的@Holger,条件的计算可能对结果产生更大的影响。
最后,@ EJP关于重用FindClass()和GetMethodID()的结果的评论非常重要。这些调用非常慢,不应该在循环中执行。
以上是关于JVM函数调用与从本机方法返回的性能?的主要内容,如果未能解决你的问题,请参考以下文章
从函数返回“本地”字符*与从函数返回“本地”int*之间的区别[重复]
哪个本机函数导致 JNI 代码中的 EXCEPTION_ACCESS_VIOLATION?