Jer*_*ers 7 java performance android casting android-ndk
我需要通过两个Android设备之间的套接字发送500,000个int的数组.目前,我花了很多时间将int []转换为byte [],这样Java的套接字就会接受它(参见我之前的问题,在Java中的套接字上有效地发送大型int [],我们确定没有更快的方法在Java中进行类型转换).
我现在的问题是,如果我将int []并通过JNI传递给Android NDK,我是否可以期望在本机代码中将字节转换为byte []更快?我知道在普通的C中,对*char进行类型转换是非常简单的,但是我想知道JNI是否会否定任何性能提升.
此外,一旦我的本机代码中有一个byte [],我是否可以有效地将其传递回我的Java代码,或者我是否还需要在C中实现套接字?
编辑1:人们在没有点击链接的情况下发布了大量答案.使用ByteBuffers不是一个好的选择,它实际上比掩码和移位慢,这仍然比我的性能关键代码需要慢!这就是我问NDK的原因.
编辑2:我改变了上面的文字,说C代码可以从int*转换为char*而不是int []转换为byte [].希望这澄清了这个问题.
编辑3:为了澄清我的用例,这是一个研究问题,我在多个设备上分配大量的int并且并行地对列表进行排序.假设我在Java中有500,000个整数(无论它们来自哪里)我需要尽快通过套接字将它们从设备中取出.说"不要以一系列整数开头"的答案没有帮助.此外,我的应用程序代码需要尽可能接近100%的Java.如果原生的类型转换和套接字提高了性能,那没关系,但我不能做其他任何事情(即排序)本地.
不,使用 JNI/NDK 不会给您带来性能提升。首先,当您尝试将数组转移到本机代码时,您必须复制它或使用直接分配的 ByteBuffer。结果 Dalvik VM 的实现总是从 Get*ArrayElements() 返回直接指针。我确实怀疑您是否会获得性能提升,因为通过 JNI 的调用会产生开销成本。最后,C++ 和 Java 在这种情况下具有非常接近的性能(请参阅C++ 性能与 Java/C#)。
看看这个问题和第一个答案,了解从 Java 将 int[] 转换为 byte[] 的快速方法如何将 int[] 转换为 byte[]
您首先使用 int[] 而不是 byte[] 是否有原因?如果是图像,我们也许能够推荐避免转换的方法。
归档时间: |
|
查看次数: |
1015 次 |
最近记录: |