2012-10-27 77 views
5

我想使用這個庫,我發現它是一個純粹的java端口(不是包裝)zeromq。 我想測試它,雖然它claims一些很好的數字,我正在執行的測試是給予相當差的結果,它甚至在本地執行(客戶端和服務器在同一臺機器上)。我相信這是我做錯了。它大約需要。 5秒執行此10.000消息循環。爲什麼這個JeroMQ(ZeroMQ端口)基準測試如此緩慢?

我所做的就是以Hello World爲例,並刪除了暫停和系統輸出。下面是代碼:

服務器:

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

客戶:

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

是可以解決這個代碼,並得到一些體面的數字?

+0

其他人回答瞭如何獲得更快的數字 - 通過做別的事情。我只想指出,從絕對數字來看,你的數字並不一定是壞的:平均每個往返消息0.5毫秒。作爲往返的一部分,該消息被解析爲高級語言,並將其處理後的版本發回。比較一下你所做的一個簡單的ICMP ping,你會感覺到TCP,JeroMQ和你的代碼的開銷。 –

回答

13

您正在執行往返請求回覆,而使用C++ libzmq的速度會很慢。當您進行流式傳輸時,您只會在JeroQM,ZeroMQ或任何I/O上獲得快速性能。

由於I/O和TCP的工作原因,往返時間很慢。在libzmq上,我們可以使用往返操作大約20K條消息/秒,使用流式處理可以實現8M /秒。流式傳輸具有其他優化方式,例如批量處理,您無法使用往返請求回覆。

對於吞吐量性能測試,從節點1發送10M消息到節點2,然後發送一個單一的ACK,當你得到它們。在ZeroMQ和JeroMQ上的時間,你應該看到大約3倍的速度差異。

相關問題