JNI叫什么慢?

问题:

我知道在Java中进行JNI调用时,“跨越边界”很慢。
但是我想知道what是否会使其变慢?
在进行JNI调用时,底层的jvm实现会做什么呢?

回答:

首先,值得注意的是,“慢”,我们在谈论可能需要几十纳秒的东西。对于微不足道的本机方法,2010年,我在Windows桌面上平均测量了40ns的通话时间,在Mac桌面上测量了11ns。除非你进行many电话,否则你不会注意到。
也就是说,调用本机方法可以比通常的Java方法调用slower。原因包括:

  • 本地方法不会由JVM内联。这些机器也不会及时编译 – 它们已经被编译了。
  • 可以复制Java数组以访问本机代码,然后复制回来。成本在数组的大小上可以是线性的。我在Windows桌面上测量了一个100,000阵列的JNI copying平均大约75微秒,而Mac上则为82微秒。幸运的是,可以通过GetPrimitiveArrayCriticalNewDirectByteBuffer获得直接访问。
  • 如果方法传递一个对象,或需要进行回调,那么本机方法可能会自己调用JVM。从本地代码访问Java字段,方法和类型需要类似于反射。签名在字符串中指定,并从JVM查询。这很慢and容易出错。
  • Java字符串是对象,具有长度并被编码。访问或创建字符串可能需要O(n)副本。

在“9.2:检查JNI成本”一节中,可以从Steve Wilson和Jeff Kesselman的“Java ?? Platform Performance:Strategies and Tactics”中找到一些额外的讨论。大约是this page的三分之一,在下面的@Philip的评论中提供。
2009年IBM developerWorks论文“Best practices for using the Java Native Interface”提供了一些关于避免JNI出现性能问题的建议。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What makes JNI calls slow?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

88 + = 97