解释Java本机通信性能
现在我正在使用JNA进行Java本机通信,并对其简单性感到满意。但是,我确实需要优化性能,并且正在考虑使用其他绑定 我的问题是:Java本机通信的“昂贵”部分是什么?这是他们之间的数据传递吗解释Java本机通信性能,java,java-native-interface,native,swig,jna,Java,Java Native Interface,Native,Swig,Jna,现在我正在使用JNA进行Java本机通信,并对其简单性感到满意。但是,我确实需要优化性能,并且正在考虑使用其他绑定 我的问题是:Java本机通信的“昂贵”部分是什么?这是他们之间的数据传递吗 让我换一种说法。现在,我的JNA接口调用的函数根本不向Java传递任何数据,而且这些函数甚至不经常被调用。换句话说,Java调用一个库调用,然后库调用自己做一段时间,并返回一个基元类型。在这种情况下,JNI/Swig/etc会比JNA快吗?给定您的用例,JNI不会比JNA快 Java本机交互的代价是传输大量
让我换一种说法。现在,我的JNA接口调用的函数根本不向Java传递任何数据,而且这些函数甚至不经常被调用。换句话说,Java调用一个库调用,然后库调用自己做一段时间,并返回一个基元类型。在这种情况下,JNI/Swig/etc会比JNA快吗?给定您的用例,JNI不会比JNA快 Java本机交互的代价是传输大量内存。特别是,为本机代码提供Java内存可能非常昂贵;IIRC这部分是因为Java可以随心所欲地分割内存,但是本机代码需要连续的内存块——内存的移动/复制需要一些时间 如果您关心性能,那么应该确保JNA代码使用“直接”样式的访问,而不是原始接口样式的访问
另外,如果需要在java和本机代码之间传输大量内存,则应该考虑使用一个初始的直接分配(如果可能的话),并且避免定期重新分配内存。这样,您只需在开始时支付一次分配成本,因此在大量呼叫中,该成本可以忽略不计