在 Java 中通过套接字高效发送大型 int[]
我正在开发一个Java应用程序,我需要尽快通过套接字连接将500,000个整数的数组从一部Android手机发送到另一部Android手机。主要的瓶颈似乎是转换整数,以便套接字可以获取它们,无论我使用ObjectOutputStreams,ByteBuffers还是低级掩码和移位转换。通过套接字将int[]从一个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;
}
使用字节缓冲器和 IntBuffer:0.75 秒
public static byte[] intToByte(int[] input)
{
ByteBuffer byteBuffer = ByteBuffer.allocate(input.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(input);
byte[] array = byteBuffer.array();
return array;
}
ObjectOutputStream:3.1秒(我尝试使用DataOutPutStream和writeInt()而不是writeObject()来改变它,但它并没有太大的区别)
public static void sendSerialDataTCP(String address, int[] array) throws IOException
{
Socket senderSocket = new Socket(address, 4446);
OutputStream os = senderSocket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream (os);
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(array);
oos.flush();
bos.flush();
os.flush();
oos.close();
os.close();
bos.close();
senderSocket.close();
}
最后,我用来发送byte[]的代码:在intToByte()函数上加了0.2秒
public static void sendDataTCP(String address, byte[] data) throws IOException
{
Socket senderSocket = new Socket(address, 4446);
OutputStream os = senderSocket.getOutputStream();
os.write(data, 0, data.length);
os.flush();
senderSocket.close();
}
我正在套接字的两端编写代码,因此我可以尝试任何类型的字节序,压缩,序列化等。必须有一种方法可以在Java中更有效地进行这种转换。请帮忙!