我正在开发一个Java应用程序,需要尽可能快地将包含500,000个整数的数组从一个Android手机发送到另一个Android手机。目前主要的瓶颈是将整数转换为套接字所需的格式,无论是使用ObjectOutputStreams、ByteBuffers还是低级别的掩码和移位转换方式。什么是从一个Java应用程序向另一个发送int[]最快的方法?
下面是我已经尝试过的所有代码,以及我在测试的LG Optimus V上(600 MHz ARM处理器,Android 2.2)的基准测试结果。
低级别的掩码和移位:0.2秒
下面是我已经尝试过的所有代码,以及我在测试的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;
}
使用ByteBuffer和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中肯定有更有效率的方式来进行这种转换,请帮忙提供一下!
DataOutputStream
包装BufferedOutputStream
,而不是尝试自己进行转换。 - parsifalDataOutputStream
(而不是ObjectOutputStream
)写入原始二进制数据没有区别。 - parsifal