我目前正在对一些通信中间件进行延迟基准测试,我发现ZeroMQ REQ
和REP
套接字的速度非常慢。例如,我期待ZeroMQ比ZeroC Ice更快。为了完整起见,这里是迄今为止的测试结果:
消息是远程调用,数据结构作为参数。数据结构包含基本类型的字段(int,float,double,boolean,string)。起初我怀疑使用Protocol Buffers序列化数据可能是ZeroMQ的瓶颈,但后来我使用空消息测试,结果非常相似。即使ZeroMQ发送空消息,Ice也会更快。
尽管如此,我想给ZeroMQ一个公平的机会。本着这种精神,我想知道我是否可以以任何方式提高REQ
和REP
的速度。也许我应该使用其他套接字?唯一的限制是通信应该像RPC一样。客户在期望其消息的结果时不应该做任何工作。
以下是我的实施代码。我提供了Java版本的基准测试,但结果非常类似于Python(有点慢)和C ++(更快一点):
客户端
...
MQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REQ);
socket.connect("tcp://*:5555");
for(int i=0; i<measuredIterations; i++){
t0 = System.nanoTime();
socket.send("",0);
socket.recv(0);
rtt = System.nanoTime() - t0;
...
}
服务器
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REP);
socket.bind("tcp://*:5555");
while (!Thread.currentThread().isInterrupted()){
socket.recv(0);
socket.send("",0);
}
其余代码基本上用于计算平均延迟和每秒消息。
也许ZeroMQ对于这种通信模式来说速度很慢,而且它在多对多通信模式中表现出色......
注意:我&#34;温暖&#34;记录结果之前的两个中间件。然而,ZeroMQ总是比Ice慢。
EDIT1 :我将升温迭代的次数增加到10000次。新的结果是: