1

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

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

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

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

编辑

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

2 回答 2

4

我会考虑使用具有本机字节顺序的直接 ByteBuffer 。这样做的好处是它以某种方式使用 C 空间内存,这意味着您无需复制它即可在 Java 中访问它(反之亦然)

于 2012-07-02T18:21:18.577 回答
1

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

不,这些声明并不矛盾,因为所说明的是您所要求的是实现细节,并且取决于您将使用的 JDK 实现。
您不应该期望所有实现都具有相同的行为,您应该查看哪个实现了您想要的。
为了给您一个实现差异的示例,SUNJDK 将代码传递char[]Cnull 终止,而 IBM 没有。
所以你应该深入研究实现和测试。至于您的问题,我不确定为什么不会发生数组副本,因为我相信内存区域完全发生了变化

于 2012-07-02T18:01:09.000 回答