boost :: asio :: strand post方法性能

时间:2015-04-29 10:36:35

标签: c++ boost boost-asio

我正在测量从事件A到事件线的线程A的性能,直到线开始处理它。我被假定对于不同数量的接收数据包,从下面的例子中得到500或1,在收到数据包时不会影响boost::asio::strand,因为我只是将指针传递给数据包数组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;
    }

1 个答案:

答案 0 :(得分:3)

假设是正确的。但是,分析是错误的。时间戳不是衡量strand::post()的效果。相反,他们正在测量完成处理程序发布到strand的时间,以及io_service开始执行完成处理程序的时间,这会受到众多因素(线程,当前工作负载,当前strand积压等。)

要衡量strand::post()的效果,需要在帖子之前和之后立即采样:

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

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

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

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