Problema de desempenho usando fluxos de objetos Javas com soquetes

Estou tentando fazer o IPC local usando fluxos de soquetes e objetos em Java, mas estou tendo um desempenho ruim.

Estou testando o tempo de ping do envio de um objeto por meio de um ObjectOutputStream para receber uma resposta por meio de um ObjectInputStream por meio de um soquete.

Aqui está o solicitante:

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();
    }
}

Aqui está o respondedor:

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();
    }
}

O resultado que estou obtendo é:

Por ping: 80.35

80 ms está muito lento para o tráfego local.

As classes de solicitação e resposta são muito pequenas e sua serialização é rápida.

Eu tentei adicionar ingenuamente:

socket.setKeepAlive(true);  
socket.setTcpNoDelay(true);

com pouco efeito.

executando um ping localhost:

64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=0 ttl=64 time=0.035 ms  
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 time=0.037 ms  
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=64 time=0.049 ms  
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=64 time=0.039 ms  
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=4 ttl=64 time=0.056 ms  

também é rápido.

Java versão 1.6.0_05l Executando no RedHat 2.4

questionAnswers(5)

yourAnswerToTheQuestion