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()方法回答了FastNativeCriticalNative的限制,那么第一种方式(没有C-to-Java调用)将表现得更好。

另一方面,正如上面提到的@Holger,条件的计算可能对结果产生更大的影响。

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

以上是关于JVM函数调用与从本机方法返回的性能?的主要内容,如果未能解决你的问题,请参考以下文章

从函数返回“本地”字符*与从函数返回“本地”int*之间的区别[重复]

从本机调用 C# 以检索字符串

哪个本机函数导致 JNI 代码中的 EXCEPTION_ACCESS_VIOLATION?

如何用简单的英语解释回调?它们与从另一个函数调用一个函数有何不同?

无法在 JNI 中更新作业

为啥从独立函数生成的 pyplot 窗口与从事件处理程序调用的函数生成时的行为不同?