我正在测量线程 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/