6

我想使用我发现的这个库,它是 zeromq 的纯 Java 端口(不是包装器)。我正在尝试对其进行测试,虽然它声称有一些不错的数字,但我正在执行的测试结果相当糟糕,甚至在本地执行(客户端和在同一台机器上服务)。我确定这是我做错了什么。大约需要。5 秒来执行这 10.000 条消息循环。

我所做的只是采用 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();
    }
}

是否可以修复此代码并获得一些不错的数字?

4

2 回答 2

15

您正在执行往返请求-回复,使用 C++ libzmq 会很慢。当您进行流式传输时,您只会在 JeroQM、ZeroMQ 或任何 I/O 上获得快速性能。

由于 I/O 和 TCP 的工作方式,往返很慢。在 libzmq 上,我们可以使用往返传输大约 20K 消息/秒,使用流传输可以处理 8M/秒。流式传输具有其他优化,例如批处理,这是往返请求-回复无法做到的。

对于吞吐量性能测试,从节点 1 向节点 2 发送 10M 消息,然后在收到消息时发回单个 ACK​​。在 ZeroMQ 和 JeroMQ 上,您应该会看到大约 3 倍的速度差异。

于 2012-11-04T11:03:16.017 回答
4

请参考同步往返和异步往返的吞吐量测试

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

异步比同步往返快 40 倍。

如果您想对 jeromq 的全速进行基准测试,请在您的环境中运行 perf.LocalThr 和 perf.RemoteThr。

于 2012-11-13T17:12:21.890 回答