boost::asio::strand post方法性能
boost::asio::strand post method performance
我一直在测量线程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()
的性能。
相关文章:
- 哪种方法更好,性能明智
- 不同的类或结构初始化方法之间的性能差异是什么?
- std::map 索引运算符与插入方法的性能
- 在.cpp文件中定义方法而不是在 C++ 的 .h 文件中定义方法时,如何提高代码的性能?
- 在类实例或方法的上下文中调用函数以进行性能分析
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- Union-Find方法性能,迭代与递归
- 虚拟方法与std ::功能成员变量在性能方面
- 是否有更好的方法(性能提高 /内置功能)获得矩形的旋转角度
- 类方法VS类静态函数VS简单函数-性能方面
- 清除rwtexture2d的大多数性能方法
- boost::asio::strand post方法性能
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么
- 这种错误检查方法的性能会不会太高
- 为性能库制作高效包装器的智能方法
- 就百分比而言,这两种方法之间的平均性能差异有多大
- 无法为C++方法添加性能探测
- Linux 性能监控,任何监视每个线程的方法
- 初始化方法与构造函数加赋值的方法——性能有什么不同?(C++)
- 测试值是否在阈值范围内的最佳方法(性能方面)是什么