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

boost::asio::strand post method performance

本文关键字:方法 性能 post strand asio boost      更新时间:2023-10-16

我一直在测量线程A将事件发布到链,直到链开始处理它的性能。我认为,对于不同数量的接收数据包,500或下例中的1不会影响boost::asio::strand接收数据包的时间,因为我只是将指向数据包数组packets_ptr的指针传递到链,我相信没有涉及复制。然而,在我分别计时9999999次迭代后,结果显示不同大小的迭代甚至不相似。对于1的大小,它总是需要1到9微秒,对于500的大小,其bw在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绑定到处理程序,那么复制构造将受到复制的元素数量的影响
  • 有多个线程同时更改strand的内部结构。由于strand提供线程安全性,因此在strand::post()内可能发生线程争用

在原始代码中,无论接收到多少消息,从boost::bind()返回的函子都具有相同的类型。此外,它及其约束论点具有统一的复制/移动构建成本。因此,接收到的消息量不会影响strand::post()的性能。