我正在开发一个Java应用程序,我需要尽快通过套接字连接从一部Android手机向另一部Android手机发送500,000个整数数组.主要的瓶颈似乎是转换整数,因此套接字可以使用它们,无论我使用ObjectOutputStreams,ByteBuffers还是低级掩码和移位转换.通过套接字将int []从一个Java应用程序发送到另一个Java应用程序的最快方法是什么?
这是迄今为止我尝试过的所有内容的代码,LG Optimus V上的基准测试我正在测试(600 MHz ARM处理器,Android 2.2).
低级掩码和移位:0.2秒
public static byte[] intToByte(int[] input)
{
byte[] output = new byte[input.length*4];
for(int i = 0; i < input.length; i++) {
output[i*4] = (byte)(input[i] & 0xFF);
output[i*4 + 1] = (byte)((input[i] & 0xFF00) >>> 8);
output[i*4 + 2] = (byte)((input[i] & 0xFF0000) >>> 16);
output[i*4 + 3] = (byte)((input[i] & 0xFF000000) >>> 24);
}
return output;
}
Run Code Online (Sandbox Code Playgroud)
使用ByteBuffer和IntBuffer:0.75秒
public static byte[] intToByte(int[] input)
{
ByteBuffer byteBuffer = ByteBuffer.allocate(input.length * 4);
IntBuffer intBuffer …Run Code Online (Sandbox Code Playgroud) 我需要通过两个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.如果原生的类型转换和套接字提高了性能,那没关系,但我不能做其他任何事情(即排序)本地.