使用 ZMQ 流式传输图像,message_t 分配需要太多时间
Streaming images with ZMQ, message_t allocation takes too much time
我一直在尝试找出如何使用 zeromq 流式传输图像(我使用的是 cppzmq 包装器,但原始 API 答案很好)。天真地,我设置了
zmq::context_t ctx(4);
zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
pub_image_socket.bind("tcp://127.0.0.1:8001");
...
while(true){
//render to image...
zmq::message_t image_message(image_size.x*image_size.y*element_size);
copy_image_to(image, image_message);
pub_image_socket.send(image_message, zmq::send_flags::none);
}
我想也许 zmq 链的其他部分花费了很多时间,所以我做了以下(在调试版本中):
//zmq::context_t ctx(4);
//zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
//pub_image_socket.bind("tcp://127.0.0.1:8001");
...
while(true){
//render to image...
zmq::message_t image_message(image_size.x*image_size.y*element_size);
//commented out so only message creation left
//copy_image_to(image, image_message);
//pub_image_socket.send(image_message, zmq::send_flags::none);
}
运行时没有移动(visual studio 分析器实际上无法告诉我减速的原因)。
所以我决定这样做:
zmq::context_t ctx(4);
zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
pub_image_socket.bind("tcp://127.0.0.1:8001");
...
while(true){
//render to image...
//zmq::message_t image_message(image_size.x*image_size.y*element_size);
//commented out so only message creation left
//copy_image_to(image, image_message);
//pub_image_socket.send(image_message, zmq::send_flags::none);
}
注释掉 image_message
使我的运行时间增加了一倍多...不过我不确定我能做些什么来阻止它,理论上我可以通过在 message_t 但 。每帧分配兆字节需要太多时间。
由于这个限制,我开始认为 ZeroMQ 不可能进行数据流,我应该只使用 asio 和 tcp/udp 套接字。有没有办法在 ZMQ 中避免这种巨大的重新分配成本?
使用zmq_msg_init_data
http://api.zeromq.org/master:zmq-msg-init-data
您可以提供已分配内存的内存 pointer/size,zeromq 将获得所有权(跳过额外分配)。一旦它被处理并且不再需要,它将调用相关的自由函数,您自己的代码可以在其中清理。
我过去在内存池/循环缓冲区中使用过这种方法,效果很好。
我一直在尝试找出如何使用 zeromq 流式传输图像(我使用的是 cppzmq 包装器,但原始 API 答案很好)。天真地,我设置了
zmq::context_t ctx(4);
zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
pub_image_socket.bind("tcp://127.0.0.1:8001");
...
while(true){
//render to image...
zmq::message_t image_message(image_size.x*image_size.y*element_size);
copy_image_to(image, image_message);
pub_image_socket.send(image_message, zmq::send_flags::none);
}
我想也许 zmq 链的其他部分花费了很多时间,所以我做了以下(在调试版本中):
//zmq::context_t ctx(4);
//zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
//pub_image_socket.bind("tcp://127.0.0.1:8001");
...
while(true){
//render to image...
zmq::message_t image_message(image_size.x*image_size.y*element_size);
//commented out so only message creation left
//copy_image_to(image, image_message);
//pub_image_socket.send(image_message, zmq::send_flags::none);
}
运行时没有移动(visual studio 分析器实际上无法告诉我减速的原因)。
所以我决定这样做:
zmq::context_t ctx(4);
zmq::socket_t pub_image_socket(ctx, zmq::socket_type::pub);
pub_image_socket.bind("tcp://127.0.0.1:8001");
...
while(true){
//render to image...
//zmq::message_t image_message(image_size.x*image_size.y*element_size);
//commented out so only message creation left
//copy_image_to(image, image_message);
//pub_image_socket.send(image_message, zmq::send_flags::none);
}
注释掉 image_message
使我的运行时间增加了一倍多...不过我不确定我能做些什么来阻止它,理论上我可以通过在 message_t 但
由于这个限制,我开始认为 ZeroMQ 不可能进行数据流,我应该只使用 asio 和 tcp/udp 套接字。有没有办法在 ZMQ 中避免这种巨大的重新分配成本?
使用zmq_msg_init_data
http://api.zeromq.org/master:zmq-msg-init-data
您可以提供已分配内存的内存 pointer/size,zeromq 将获得所有权(跳过额外分配)。一旦它被处理并且不再需要,它将调用相关的自由函数,您自己的代码可以在其中清理。
我过去在内存池/循环缓冲区中使用过这种方法,效果很好。