c++ - zmq cpp 性能与 `qperf` 报告的延迟相比
问题描述
我试图弄清楚为什么qperf
报告延迟(一种方式)x
和 REQ/REP(往返)报告类似于4x
. 我必须做任何特定的套接字调整吗?因为如果我只是打开套接字,设置 TCP_NODELAY(默认情况下在 ZMQ 中设置)我得到的延迟非常接近(对于 1k 缓冲区)报告的数字qperf
。然而,ZMQ 落后于这些数字大约 4-5 倍
ZMQ 服务器
zmq::context_t context;
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://*:5555");
while (true) {
zmq::message_t request;
// Wait for next request from client
socket.recv(&request);
// Send reply back to client
zmq::message_t reply(5);
memcpy(reply.data(), "World", 5);
socket.send(reply);
}
ZMQ 客户端
zmq::context_t context;
zmq::socket_t socket(context, ZMQ_REQ);
std::cout << "Connecting to hello world server…" << std::endl;
socket.connect("tcp://my.host:5555");
const size_t cycles = 100'000;
double throughput = 0;
zmq::message_t reply;
auto start = std::chrono::high_resolution_clock::now();
vector<uint8_t> buff(MessageSize, 0);
for (auto i = 0ul; i < cycles; ++i) {
zmq::message_t request(MessageSize);
memcpy(request.data(), buff.data(), MessageSize);
throughput += request.size();
socket.send(request);
// Get the reply.
socket.recv(&reply);
}
auto end = std::chrono::high_resolution_clock::now();
auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
std::cout << "Latency: " << us / cycles << "us." << std::endl;
std::cout << "Througput: " << std::fixed << throughput / us * 1'000'000 / 1024 / 1024 << "MiB/s." << std::endl;
两者本质上都是这里提供的 ZMQ 示例http://zguide.zeromq.org/cpp:hwclient
一些背景,Linux,Ubuntu,GCC 7.3,由 提供的静态库vcpkg
,本地构建,看起来像是他们从 github 拉大师。
解决方案
推荐阅读
- sql - 用于重命名 SQL Server XML 中的元素的函数
- c - 不能在可变二维数组中使用 scanf
- c# - 将 lambda 函数作为参数传递并在方法体中给出其参数
- ruby-on-rails - form_for 嵌套属性:创建不保存到数据库
- python - 未知速记标志:-E 中的“E”
- c# - 尝试将图像链接作为字符串传递给 POST 网络请求以发送到 API
- json - 在 SQL Server 2016 中使用 JSON 的两列字符串聚合
- output - 为什么随机森林从相同的输入生成不同的输出
- db2 - 在 Function 中使用 Unpivot
- python - 将 python 应用程序打包到 deb 中会抑制虚拟环境的使用吗?