6

私が見つけたこのライブラリを使用したいと思います。これは、zeromq の純粋な Java ポート (ラッパーではない) です。私はそれをテストしようとしていますが、いくつかの良い数値を主張していますが、私が実行しているテストはかなり悪い結果を示しており、ローカルで実行されています (クライアントと同じマシンで提供しています)。私はそれが私が間違っていることだと確信しています。約かかります。この 10.000 メッセージのループを実行するのに5 秒かかります。

私がしたことは、Hello world の例を取り上げて、一時停止と sysout を削除しただけです。コードは次のとおりです。

サーバー:

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 のメッセージを送信し、それらを取得したら 1 つの 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 に答える