无限循环vs boost::asio::deadline_timer c++性能
infinite loop vs boost::asio::deadline_timer C++ performance
我开发了一个处理来自客户机的许多连接的服务器应用程序。服务器定期(例如:每1秒)向每个客户端发送消息,检查客户端的过期时间(当连接时间达到预定值时,每个客户端必须与服务器强制断开连接)以及其他一些定时器任务。我考虑了两个解决方案:
- 使用while(true){foreach客户端{检查时间}}
- 为每个客户端指定一个deadline_timer并为每个任务调用async_wait,这样就会产生大量的deadline_timer实例
哪个解决方案对性能更好?一般来说,我应该使用无限循环还是声明多个计时器实例?还有一个问题,你能解释一下OS是如何管理deadline_timer的吗?
Q。哪个解决方案对性能更好?
无限循环通常是不好的。在具有线程亲和性的cpu饱和工作线程中发现的异常(但在这里似乎不适用)。
没有Q。一般来说,我应该使用无限循环
吗?
Q。或声明多个计时器实例?
或者只是
std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers;
或类似的
Q。还有一个问题,你能解释一下OS是如何管理deadlien_timer的吗?
计时器在底层使用平台特定的内核事件。这意味着,在实践中,如果你有10个任务都阻塞在不同的计时器上,内核将保持进程处于睡眠状态(根本不运行),直到第一个任务到期。
到目前为止,内核级同步原语通常是处理非cpu绑定工作负载的最快方式。
您是否要求每个客户端超时正好(或几乎)为一秒?
我会用第三种方法:
while (true) {
if ( elapsed_one_second() ) {
for each client {
client->check_timeout();
}
}
或者如果你有事件队列,你做一个定时器来触发所有客户端的检查。
编辑:如果你有大量的计时器,你也可以考虑实现增量队列,并使用一次性计时器来处理最早的事件。
相关文章:
- 是否需要在 Timer.5 boost::asio 教程中运行新线程?
- libevent是否允许在不同的线程中运行timer/io的回调
- QGraphicsView / Qgraphicsscene Timer事件不起作用
- 使用boost::asio::deadline_Timer实现通用Timer类时出现问题
- 创建 Timer 类时,我应该使用什么数据类型来保存值?(C/C++)
- C++ `Timer` class implementation
- 用c++编写Timer类
- Qt QLCDNumber Timer
- 在 c# 中是否有等效的 boost::timer::cpu_timer
- NachOS timer.cc 构造函数
- 在 c++ 中是否有像 timer 和 timertask 这样的东西,就像 java 一样
- c++计时器,相当于.NET System.Threading.timer
- 开始使用boost-cpu_timer时,错误:“boost::timer::cpu_timer”尚未声明
- 如何从boost::timer::cpu_timer获取以秒为单位的运行时间
- 如何为一些类(如timer类)编写单元测试
- 如何在c++中创建Timer任务
- Boost Timer 24小时格式
- 如何重启boost::timer::cpu_timer
- 在Timer ISR内使用FreeRTOS中的全局值
- Linux c++ timer周期性回调