我需要通过两个 Android 设备之间的套接字发送一个包含 500,000 个整数的数组。目前,我花费大量时间将 int[] 转换为 byte[] 以便 Java 的套接字能够接受它(请参阅我之前的问题Efficiently send large int[] over sockets in Java,我们确定没有更快的方法在 Java 中进行类型转换)。
我现在的问题是,如果我采用 int[] 并通过 JNI 将其传递给 Android NDK,我是否可以期望对 byte[] 的类型转换在本机代码中更快?我知道在普通的 C 中将 int* 类型转换为 char* 非常简单,但是我想知道 JNI 是否会否定任何性能提升。
此外,一旦我的本机代码中有一个 byte[],我可以有效地将它传递回我的 Java 代码,还是我还需要在 C 中实现套接字?
编辑1:人们在没有点击链接的情况下发布了很多答案。使用 ByteBuffers 不是一个好的选择,它实际上比 mask-and-shift 慢得多,这仍然比我的性能关键代码需要慢得多!这就是我问NDK的原因。
编辑 2:我更改了上面的文字,说 C 代码可以从 int* 转换为 char* 而不是 int[] 转换为 byte[]。希望这能澄清这个问题。
编辑 3:为了澄清我的用例,这是一个研究问题,我在多个设备上分布大量整数并对列表进行并行排序。假设我在 Java 中有 500,000 个整数(不管它们来自哪里),我需要尽快通过套接字将它们从设备中取出。说“不要以整数数组开头”的答案没有帮助。此外,我的应用程序代码需要尽可能接近 100% Java。如果本机类型转换和套接字提高了性能,那没关系,但我不能在本机上做任何其他事情(即排序)。