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