代码之家  ›  专栏  ›  技术社区  ›  Yuvi Masory

解释Java本地通信性能

  •  4
  • Yuvi Masory  · 技术社区  · 15 年前

    现在我正在使用JNA进行Java本地通信,很高兴它的简单性。不过,我确实需要优化性能,并考虑使用其他绑定。

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

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

    1 回复  |  直到 15 年前
        1
  •  6
  •   Mark Elliot    15 年前

    考虑到您的用例,JNI不会比JNA快。

    Java本地交互的昂贵之处在于传输大量内存。特别是,使Java内存对本机代码可用是非常昂贵的;IIRC,这部分是因为Java可以选择对它所喜欢的内存进行分段,但是本机代码会期望连续的内存块——内存的移动/复制需要一些时间。

    如果您关心性能,那么应该确保您的JNA代码使用“直接”样式访问,而不是原始的接口样式访问。

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