Я пытаюсь сделать локальный IPC с использованием потоков Sockets и Object на Java, но я вижу плохую производительность.
Я тестирую время ping отправки объекта через ObjectOutputStream для получения ответа через ObjectInputStream через Socket.
Здесь Requestor:
public SocketTest(){
int iterations = 100;
try {
Socket socket = new Socket("localhost", 1212);
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
double start = System.currentTimeMillis();
for (int i = 0; i < iterations; ++i) {
Request request = new Request();
objectOutputStream.writeObject(request);
Response response = (Response)objectInputStream.readObject();
}
double finish = System.currentTimeMillis();
System.out.println("Per ping: " + (finish - start) / iterations );
} catch (Exception e) {
e.printStackTrace();
}
}
Здесь ответчик:
public ServerSocketTest(){
try {
ServerSocket serverSocket = new ServerSocket(1212);
Socket socket = serverSocket.accept();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
Request request = (Request)objectInputStream.readObject();
while (request != null) {
Response response = new Response();
objectOutputStream.writeObject(response);
request = (Request)objectInputStream.readObject();
}
} catch (Exception e) {
e.printStackTrace();
}
}
В результате я получаю:
За пинг: 80.35
80 мс мешает локальному трафику.
Класс запроса и ответа очень мал, и их сериализация выполняется быстро.
Я попытался наивно добавить:
socket.setKeepAlive(истина);
socket.setTcpNoDelay(истина);
с небольшим эффектом.
выполнение ping localhost:
64 байта из localhost.localdomain(127.0.0.1): icmp_seq = 0 ttl = 64 раз = 0,035 мс
64 байта из localhost.localdomain(127.0.0.1): icmp_seq = 1 ttl = 64 раз = 0,037 мс
64 байта из localhost.localdomain(127.0.0.1): icmp_seq = 2 ttl = 64 раз = 0,049 мс
64 байта из localhost.localdomain(127.0.0.1): icmp_seq = 3 ttl = 64 раз = 0,039 мс
64 байта из localhost.localdomain(127.0.0.1): icmp_seq = 4 ttl = 64 раз = 0,056 мс
также быстро.
Java-версия 1.6.0_05l Запуск на RedHat 2.4
Любые идеи будут оценены.