2012-10-27 15 views
5

Chciałbym użyć tej biblioteki, którą znalazłem, jest to czysty port java (nie opakowanie) zeromq. Próbuję go przetestować, a podczas gdy claims niektórych dobrych liczb, test, który wykonuję daje raczej słabe wyniki, a nawet jest wykonywany lokalnie (klient i służyć na tej samej maszynie). Jestem pewien, że to coś, co robię źle. Zajmuje około 5 sekund, aby wykonać tę 10.000 pętli wiadomości.Dlaczego ten benchmark JeroMQ (port ZeroMQ) jest tak wolny?

Wszystko, co zrobiłem, to wzięcie przykładu Hello world i usunięcie pauzy i sysoutów. Oto kod:

serwera:

package guide; 

import org.jeromq.ZMQ; 

public class hwserver{ 
    public static void main(String[] args) throws Exception{ 

     // Prepare our context and socket 
     ZMQ.Context context = ZMQ.context(1); 
     ZMQ.Socket socket = context.socket(ZMQ.REP); 

     System.out.println("Binding hello world server"); 
     socket.bind ("tcp://*:5555");   

     while (true) {     
      byte[] reply = socket.recv(0); 
      String requestString = "Hello" ; 
      byte[] request = requestString.getBytes();    
      socket.send(request, 0);    
     }    
    } 
} 

Klient:

package guide; 

import org.jeromq.ZMQ; 

public class hwclient{ 
    public static void main(String[] args){ 
     ZMQ.Context context = ZMQ.context(1); 
     ZMQ.Socket socket = context.socket(ZMQ.REQ); 
     socket.connect ("tcp://localhost:5555"); 

     System.out.println("Connecting to hello world server"); 

     long start = System.currentTimeMillis(); 
     for(int request_nbr = 0; request_nbr != 10_000; request_nbr++) { 
      String requestString = "Hello" ; 
      byte[] request = requestString.getBytes();   
      socket.send(request, 0); 
      byte[] reply = socket.recv(0);   
     } 
     long end = System.currentTimeMillis(); 
     System.out.println(end-start); 
     socket.close(); 
     context.term(); 
    } 
} 

Czy jest możliwe, aby rozwiązać ten kod i uzyskać kilka przyzwoitych liczb?

+0

Inni odpowiedzieli, jak uzyskać szybsze numery - robiąc coś innego. Chcę tylko podkreślić, że twoje liczby, w wartościach bezwzględnych, niekoniecznie są złe: Średnio 0,5 ms na wiadomość triple tripped. W ramach tego cyklu wiadomość jest przetwarzana na język wysokiego poziomu, a przetworzona wersja jest odsyła- na. Porównaj to z liczbami, które robisz, wykonując prosty ping ICMP, i masz wrażenie, że masz na głowie TCP, JeroMQ i twój kod. –

Odpowiedz

13

Wykonujesz w obie strony żądanie-odpowiedź, a to będzie równie powolne z użyciem libzmq w C++. Szybkość osiągniesz tylko na JeroQM, ZeroMQ lub dowolnym We/Wy podczas przesyłania strumieniowego.

Powolne przełączanie jest powolne ze względu na sposób pracy we/wy i TCP. Na libzmq możemy zrobić około 20K wiadomości na sekundę za pomocą triple tripów, a 8M/s za pomocą streamingu. Strumieniowanie ma dodatkowe optymalizacje, takie jak tworzenie partii, których nie można wykonać w odpowiedzi na żądanie w obie strony.

Aby wykonać test wydajności przepustowości, wyślij wiadomości 10M z węzła 1 do węzła 2, a następnie odeślij pojedyncze potwierdzenie ACK, gdy je otrzymasz. Czas, który na ZeroMQ i na JeroMQ, zobaczysz około 3x różnicę prędkości.