我正在开发一个 Java 应用程序,我需要尽快通过套接字连接将 500,000 个整数的数组从一部 Android 手机发送到另一部 Android 手机。主要瓶颈似乎是转换整数以便套接字可以接受它们,无论我使用 ObjectOutputStreams、ByteBuffers 还是低级别的掩码和移位转换。通过套接字从一个 Java 应用程序向另一个应用程序发送 int[] 的最快方法是什么?
这是迄今为止我尝试过的所有代码的代码,以及我正在测试的 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 中更有效地进行这种转换。请帮忙!