是什么让 JNI 调用速度变慢?
2022-08-31 06:06:24
我知道在Java中进行JNI调用时“跨越边界”是很慢的。
但是,我想知道是什么让它变慢?当进行JNI调用使其如此缓慢时,底层jvm实现会做什么?
我知道在Java中进行JNI调用时“跨越边界”是很慢的。
但是,我想知道是什么让它变慢?当进行JNI调用使其如此缓慢时,底层jvm实现会做什么?
首先,值得注意的是,通过“慢”,我们谈论的是可能需要几十纳秒的东西。对于微不足道的本机方法,在2010年,我测量了Windows桌面上的平均40 ns和Mac桌面上的11 ns的调用。除非你打了很多电话,否则你不会注意到。
也就是说,调用本机方法可能比进行普通的 Java 方法调用慢。原因包括:
一些额外的讨论,可能过时的,可以在Steve Wilson和Jeff Kesselman的“Java(tm)平台性能:战略和战术”中找到,在2000年,在“9.2:检查JNI成本”一节中。它大约是本页下方的三分之一,在下面@Philip的评论中提供。
2009 年 IBM developerWorks 的论文“使用 Java Native Interface 的最佳实践”提供了一些关于避免 JNI 性能缺陷的建议。
值得一提的是,并非所有标有“慢速”的Java方法。其中一些是使它们非常快的内在因素。要检查哪些是固有的,哪些不是,您可以在vmSymbols.hpp中查找。native
do_intrinsic