私は、ある Android 携帯電話から別の Android 携帯電話にソケット接続を介して 500,000 の整数の配列をできるだけ早く送信する必要がある Java アプリケーションに取り組んでいます。主なボトルネックは、ObjectOutputStreams、ByteBuffers、または低レベルのマスクとシフトの変換を使用するかどうかに関係なく、ソケットが整数を取得できるように整数を変換しているようです。あるJavaアプリから別の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 秒 (writeObject() の代わりに DataOutPutStream と writeInt() を使用してこのバリエーションを試しましたが、大きな違いはありませんでした)
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 でこの変換をより効率的に行う方法が必要です。助けてください!