2012-10-27 25 views
5

Tôi muốn sử dụng thư viện này tôi tìm thấy, đó là một cổng java thuần túy (không phải là một wrapper) của zeromq. Tôi đang cố gắng kiểm tra nó và trong khi nó claims một số con số tốt, thử nghiệm tôi đang thực hiện là cho kết quả khá nghèo và thậm chí nó được thực hiện cục bộ (máy khách và phục vụ trên cùng một máy). Tôi chắc chắn đó là điều tôi đang làm sai. Phải mất khoảng. 5 giây để thực hiện vòng lặp 10.000 tin nhắn này.Tại sao tiêu chuẩn JeroMQ (cổng ZeroMQ) này lại chậm?

Tất cả những gì tôi đã làm là lấy ví dụ Hello world và tạm dừng và sysouts đã loại bỏ. Đây là mã:

Server:

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

Các Chủ đầu tư:

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

Là có thể sửa mã này và nhận được một số con số phong nha?

+0

Khác đã trả lời cách nhận số nhanh hơn - bằng cách làm một việc khác. Tôi chỉ muốn chỉ ra rằng các con số của bạn, theo nghĩa tuyệt đối, không nhất thiết là xấu: Trung bình 0,5 mili giây cho mỗi thông điệp được khoanh tròn. Và như một phần của chuyến đi, tin nhắn đang được phân tích thành ngôn ngữ cấp cao và một phiên bản đã xử lý của nó được gửi lại. So sánh điều đó với các số liệu bạn có thể thực hiện một ping ICMP đơn giản, và bạn có cảm giác về phí trên của TCP, JeroMQ và mã của bạn. –

Trả lời

13

Bạn đang thực hiện trả lời yêu cầu khứ hồi và điều này sẽ chậm bằng cách sử dụng libzmq C++. Bạn sẽ chỉ nhận được hiệu suất nhanh trên JeroQM, ZeroMQ hoặc bất kỳ I/O nào khi bạn phát trực tuyến.

Vuốt tròn chậm do cách I/O và TCP hoạt động. Trên libzmq, chúng tôi có thể thực hiện khoảng 20K tin nhắn/giây bằng cách sử dụng tính năng dịch chuyển vòng tròn và 8M/giây khi sử dụng phát trực tuyến. Phát trực tuyến có các tối ưu hóa bổ sung như tạo đợt mà bạn không thể thực hiện với trả lời yêu cầu khứ hồi.

Để kiểm tra hiệu suất thông lượng, gửi 10M thư từ nút 1 đến nút 2, sau đó gửi lại một ACK đơn lẻ khi bạn nhận được chúng. Thời gian trên ZeroMQ và trên JeroMQ, bạn sẽ thấy khoảng 3 lần chênh lệch tốc độ.

3

Vui lòng tham khảo các bài kiểm tra thông giữa đồng bộ khứ hồi và không đồng bộ khứ hồi tại

https://github.com/zeromq/jeromq/blob/master/src/test/java/guide/tripping.java

Các không đồng bộ là X40 nhanh hơn so với đồng bộ khứ hồi.

Nếu bạn muốn kiểm tra tốc độ đầy đủ của jeromq, hãy chạy perf.LocalThr và perf.RemoteThr trên môi trường của bạn.