c++ - boost::asio::strand post 方法性能

标签 c++ boost boost-asio

我正在测量线程 A 将事件发布到线程的性能,直到线程开始处理它为止。我认为对于不同数量的接收数据包,500 或下面示例中的 1 不会影响 boost::asio::strand 接收数据包时,因为 < strong>我只是将数据包数组 packets_ptr 的指针传递给链,我相信没有涉及复制。然而,在我单独计时 9999999 次迭代后,结果显示它们在不同大小之间甚至不相似。对于1的大小,它总是需要在1~9微秒之间,而对于500的大小,它总是在50 ~85微秒之间。

//Socket Thread     
int packet_count = recvmmsg(mcast_fd, packets, 500, 0, NULL); //OR
    int packet_count = recvmmsg(mcast_fd, packets, 1, 0, NULL);
    .....
    packets_recv_time = timer.getTime();
    strand_.post(boost::bind(&handler_class::process_package_method, this, packets_ptr, packets_recv_time, num_of_packets));
    .....

//io_service thread
    handler_class::process_package_method(...)
    {
    prcess_beign_time = timer.getTime();
    Measure_time = prcess_beign_time - packets_recv_time;
    }

最佳答案

假设是正确的。然而,分析是错误的。时间戳并未衡量 strand::post() 的性能。相反,他们测量完成处理程序发布到 strand 中的持续时间,以及 io_service 开始执行完成处理程序的时间,这受到许多因素的影响(线程、当前工作负载、当前strand积压等)。

要测量 strand::post() 的性能,需要在发布之前和之后立即进行采样:

auto t1 = clock::now();
strand_.post(...);
auto t2 = clock::now();

当处理程序被发布到strand中时,它可能会在执行之前被复制或移动。因此,如果用户提供的处理程序的复制/移动构造具有统一的成本,则 strand::post() 的性能将相当稳定。在以下情况下可以引入方差:

  • 处理程序的复制/移动构造没有统一的成本。例如,如果将 vector 绑定(bind)到处理程序,则复制构造将受到复制元素数量的影响。
  • 有多个线程同时更改strand的内部结构。由于 strand 提供线程安全性,因此 strand::post() 内可能会发生线程争用。

在原始代码中,无论接收到的消息数量如何,从 boost::bind() 返回的仿函数都具有相同的类型。此外,它及其绑定(bind)参数具有统一的复制/移动构造成本。因此,接收到的消息量不会影响 strand::post() 的性能。

关于c++ - boost::asio::strand post 方法性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29941227/

相关文章:

c++ - 如何将 Eigen 库添加到 C++ 项目中

c++ - 如何有效计算每个多边形区域内的所有非零像素?

c++ - 为什么如果我注释了 "while" block ,程序就会死锁?其中的 "yield"行有何作用?

c++ - 将 unique_ptr 引用传递给 boost::bind?

c++ - Boost hana 获取第一个匹配项的索引

c++ - asio::streambuf 到 std::istream 丢弃新行

C++ 模板参数包自动将 & 添加到其参数

c++ - 您如何使用 boost/beast 从 HTTP POST 请求中解析和提取有效负载?

c++ - boost::asio::ip::tcp::socket - 如何绑定(bind)到特定的本地端口

c++ - 多次调用 async_accept