我正在测量从事件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;
}
答案 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()
的效果。