2012-10-27 47 views
5

Bulduğum bu kütüphaneyi kullanmak istiyorum, zeromq'un saf bir java portu (sarıcı değil). Bunu test etmeye çalışıyorum ve claims bazı iyi numaralar olsa da, yaptığım test oldukça zayıf sonuçlar veriyor ve hatta yerel olarak da (istemci ve aynı makinede çalışıyor) gerçekleştiriliyor. Eminim yanlış yaptığım bir şey. Yaklaşık sürer. 5 saniye bu 10.000 ileti döngüsünü yürütmek için.Bu JeroMQ (ZeroMQ bağlantı noktası) karşılaştırması neden bu kadar yavaş?

Tüm yaptığım Merhaba dünya örneğini almak ve duraklatma ve sysouts kaldırıldı.

Sunucu: İşte kod

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

Müşteri:

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

bu kodu düzeltmek ve bazı iyi rakamları elde etmek mümkündür mı?

+0

Diğerleri, başka bir şey yaparak daha hızlı sayıların nasıl elde edileceğini yanıtladı. Sadece rakamlarınızın, mutlak anlamda, mutlaka kötü olmadığına işaret etmek istiyorum: Yuvarlak tetiklenen mesaj başına ortalama 0,5 ms. Ve gidiş gelişin bir parçası olarak, mesaj yüksek düzey bir dile ayrıştırılıyor ve işlenmiş bir versiyonu geri gönderiliyor. Basit bir ICMP ping'i yaptığınız rakamlarla karşılaştırın ve TCP, JeroMQ ve kodunuzun yükü için bir his elde edin. –

cevap

13

Gidiş-dönüş istek-yanıtını yapıyorsunuz, ve bu da C++ libzmq kullanarak bu kadar yavaş olacaktır. Akış yaparken yalnızca JeroQM, ZeroMQ veya herhangi bir I/O üzerinde hızlı performans elde edersiniz.

Yuvarlanma, I/O ve TCP'nin nasıl çalıştığı nedeniyle yavaştır. Libzmq'de, 20K mesaj/yuvarlak çevirme kullanarak ikinci ve akış kullanarak 8M/sn yapabiliriz. Akış, gidiş-dönüş istek-cevabı ile yapamadığınız toplu işlem gibi ek optimizasyonlara sahiptir.

Verimli bir performans testi için, 10M mesajlarını node 1'den node 2'ye gönderin, ardından bunları aldığınızda tek bir ACK gönderin. ZeroMQ ve JeroMQ'da geçen süre, hızda 3x fark görmeniz gerekir.

İlgili konular