Я работаю над Java-приложением, где мне нужно как можно быстрее отправить массив из 500 000 целых чисел с одного телефона Android на другой телефон Android через сокет. Главным узким местом, по-видимому, является преобразование целых чисел, поэтому сокет может их принимать, независимо от того, использую ли я ObjectOutputStreams, ByteBuffers или низкоуровневое преобразование масок и сдвиг. Каков самый быстрый способ отправить int [] через сокет из одного приложения Java в другое?
Вот код для всего, что я пробовал до сих пор, с бенчмарками на LG Optimus V, на которых я тестирую (процессор ARM с частотой 600 МГц, 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();
}
Наконец, код, который я использовал для отправки байта []: занимает дополнительные 0.2 секунды над функциями intToByte()
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();
}
Я пишу код с обеих сторон сокета, поэтому я могу попробовать любой тип endianness, сжатие, сериализацию и т.д. Должен быть способ сделать это преобразование более эффективно на Java. Пожалуйста, помогите!