无限循环 vs boost::asio::deadline_timer C++ 性能
infinite loop vs boost::asio::deadline_timer C++ performance
我开发了一个服务器应用程序来处理来自客户端的许多连接。服务器定期向每个客户端发送消息(例如:每1秒一次),检查客户端的到期时间(当连接时间达到预定值时必须强制每个客户端与服务器断开连接)和一些其他定时器任务。我考虑了 2 种解决方案:
- 使用 while(true){foreach 客户{检查时间}}
- 对于每个客户端,delcare deadline_timer 并为每个任务调用 async_wait,因此它会产生很多 deadline_timer 个实例
哪种解决方案的性能更好?一般来说,我应该使用无限循环还是声明许多计时器实例?还有一个,你能解释一下 OS 是如何管理 deadline_timer 的吗?
您是否要求每个客户端在恰好(或几乎)一秒超时?
我会选择第三种方式:
while (true) {
if ( elapsed_one_second() ) {
for each client {
client->check_timeout();
}
}
或者如果你有事件队列,你做一个定时器来触发所有客户端的检查。
编辑:
如果你有大量的定时器,你也可以考虑实现一个增量队列,并为最早的事件使用一次性定时器。
Q. Which solution is better for performance?
无限循环通常很糟糕。在 CPU 中发现异常 - 具有线程亲和力的饱和工作人员(但这似乎不适用于此处)。
Q. In general, Should I use infinite loop
没有
Q. or declaring many timer instances?
或者只是
std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers;
或类似 :)
Q. And one more, Can you explain how OS manages deadlien_timer?
计时器在后台使用特定于平台的内核事件。这意味着,在实践中,如果你有10 个任务都阻塞在不同的计时器上,内核将使进程保持睡眠状态(根本不是 运行),直到第一个任务到期。
到目前为止,内核级同步原语通常是非 CPU 绑定工作负载的最快方式。
我开发了一个服务器应用程序来处理来自客户端的许多连接。服务器定期向每个客户端发送消息(例如:每1秒一次),检查客户端的到期时间(当连接时间达到预定值时必须强制每个客户端与服务器断开连接)和一些其他定时器任务。我考虑了 2 种解决方案:
- 使用 while(true){foreach 客户{检查时间}}
- 对于每个客户端,delcare deadline_timer 并为每个任务调用 async_wait,因此它会产生很多 deadline_timer 个实例
哪种解决方案的性能更好?一般来说,我应该使用无限循环还是声明许多计时器实例?还有一个,你能解释一下 OS 是如何管理 deadline_timer 的吗?
您是否要求每个客户端在恰好(或几乎)一秒超时?
我会选择第三种方式:
while (true) {
if ( elapsed_one_second() ) {
for each client {
client->check_timeout();
}
}
或者如果你有事件队列,你做一个定时器来触发所有客户端的检查。
编辑: 如果你有大量的定时器,你也可以考虑实现一个增量队列,并为最早的事件使用一次性定时器。
Q. Which solution is better for performance?
无限循环通常很糟糕。在 CPU 中发现异常 - 具有线程亲和力的饱和工作人员(但这似乎不适用于此处)。
Q. In general, Should I use infinite loop
没有
Q. or declaring many timer instances?
或者只是
std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers;
或类似 :)
Q. And one more, Can you explain how OS manages deadlien_timer?
计时器在后台使用特定于平台的内核事件。这意味着,在实践中,如果你有10 个任务都阻塞在不同的计时器上,内核将使进程保持睡眠状态(根本不是 运行),直到第一个任务到期。
到目前为止,内核级同步原语通常是非 CPU 绑定工作负载的最快方式。