- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!ローカルのUDP
Javaプログラム同士でUDP通信を使って
双方向でメッセージをピンポンで送信するときの時間を測定してみました.
指定したバイト数のメッセージをクライアントからサーバに送信,
サーバーは同じサイズのメッセージを送り返す,というもの.
100000回繰り返して測定.
::経過時間
{{ref_image elapsed_time.png}}
::スループット
トータルのメッセージ(メッセージ長 * 2 * 送受信回数)を
経過時間で割った値を可視化した結果.
{{ref_image throughput.png}}
::実行環境
MavericksなMac miniで実行.
system_profiler SPHardwareDataTypeは↓な感じ.
Model Name: Mac mini
Model Identifier: Macmini6,2
Processor Name: Intel Core i7
Processor Speed: 2.6 GHz
Number of Processors: 1
Total Number of Cores: 4
L2 Cache (per Core): 256 KB
L3 Cache: 6 MB
Memory: 16 GB
::使ったプログラム
よくあるサンプルと同様な感じ.
// クライアント側
import java.net.*;
import java.util.*;
public class UDPClient{
private DatagramSocket socket;
private InetAddress addr;
public UDPClient() throws Exception {
socket = new DatagramSocket();
socket.setSendBufferSize(16*1024*1024);
addr = InetAddress.getByName("127.0.0.1");
}
private byte[] recv = new byte[65536];
public boolean send(byte[] buf) throws Exception {
DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, 16384);
DatagramPacket reply = new DatagramPacket(recv, recv.length);
socket.send(packet);
socket.receive(reply);
return true;
}
public static void main(String [] args) throws Exception{
UDPClient test = new UDPClient();
byte[] buf = new byte[Integer.parseInt(args[0])];
int times = 100000;
long t0, t1;
t0 = Calendar.getInstance().getTimeInMillis();
for(int i = 0; i < times; i++){
test.send(buf);
}
t1 = Calendar.getInstance().getTimeInMillis();
test.socket.close();
System.out.println(buf.length + " " + (t1-t0));
}
}
// サーバ側
import java.io.*;
import java.net.*;
public class UDPServer{
private DatagramSocket socket;
private byte[] buf = new byte[65536];
public UDPServer() throws Exception {
socket = new DatagramSocket(16384);
socket.setReceiveBufferSize(16*1024*1024);
}
public boolean receive() throws Exception {
DatagramPacket packet= new DatagramPacket(buf, buf.length);
socket.receive(packet);
byte[] reply = packet.getData();
int len = packet.getLength();
SocketAddress sockAddress = packet.getSocketAddress();
DatagramPacket replyPacket = new DatagramPacket(reply, len, sockAddress);
socket.send(replyPacket);
return true;
}
public static void main(String [] args) throws Exception{
UDPServer test = new UDPServer();
while(test.receive() == true) ;
}
}