什么时候JNI可能需要复制原始类型的数组?

时间:2012-07-02 17:40:47

标签: java performance java-native-interface sse simd

我主要是一名C ++程序员,但我正在考虑将Java用于项目。出于性能原因,我需要使用一些SSE内在函数(即使相对于普通的C ++,这些也可以大大提高速度)。

据我了解,在Java中执行此操作的方法是使用JNI并在C中调用SSE内在函数。但是,我在JNI文档中读到的内容让我感到不安,因为它说JVM可能会或者可能会不要创建发送到C并返回的数组的副本。

假设有一个最先进的实现,比如OpenJDK 7,当我请求指向byte [],short [],int []或float []的时候我应该什么时候才能实现复制?

到目前为止,我发现的只是一些矛盾的说法。要被接受,答案必须说服我:例如提供证据或引用来源,而不仅仅表达意见/猜测。

修改

  1. 链接到GetPrimitiveArrayCritical
  2. 正如我所提到的,在回答我的问题时可以假设OpenJDK 7。

2 个答案:

答案 0 :(得分:4)

我会考虑使用带有本机字节排序的直接ByteBuffer。这样做的好处是它以一种方式使用C空间内存,这意味着你不需要复制它来用Java访问它(反之亦然)

答案 1 :(得分:1)

  

到目前为止,我发现的只是一些相互矛盾的说法

不,这些并不是相互矛盾的,因为所说的是您所要求的是 实施细节 ,并取决于您将使用的JDK实现。登记/> 你不应该期望所有实现都有相同的行为,你应该考虑哪一个做你想要的 为了给您一个实现差异的示例,SUN JDK将char[]传递给C代码null终止,而IBM则没有。 所以你应该深入研究实现和测试。至于你的问题,我不确定为什么阵列副本不会发生,因为我认为内存区域完全有变化