解释Java本地通信性能

时间:2010-02-14 03:43:56

标签: java java-native-interface native swig jna

现在我正在使用JNA进行Java本地通信,并对其简单性感到满意。但是我确实需要优化性能并考虑使用其他绑定。

我的问题是:Java本地通信的哪个部分是“昂贵的”部分?是他们之间传递数据吗?

让我换一种说法。现在我的JNA接口调用的函数根本不会将任何数据传递给Java,甚至不会经常调用这些函数。换句话说,Java调用库调用,然后库调用会自行执行一段时间并返回基本类型。在这种情况下,JNI / Swig /等会比JNA更快吗?

1 个答案:

答案 0 :(得分:6)

鉴于您的用例,JNI将不会比JNA快。

Java本机交互的代价是传输大量内存。特别是,使Java内存可用于本机代码可能非常昂贵; IIRC部分是因为Java可以选择按照自己喜欢的方式对内存进行分段,但是本机代码会期望连续的内存块 - 内存的移动/复制需要一些时间。

如果您担心性能问题,则应确保您的JNA代码使用“直接”样式访问而不是原始界面样式访问。

此外,如果您确实需要在Java和本机代码之间传输大量内存,则应考虑使用单个初始直接分配(如果可能)并避免定期重新分配该内存。这样,您只需支付一次分配成本,并且在开始时,因此在大量呼叫中,成本变得可以忽略不计。