[英]infinite loop vs boost::asio::deadline_timer C++ performance
我开发了一个服务器应用程序,可以处理来自客户端的许多连接。 服务器定期向每个客户端发送消息(例如,每1秒发送一次),检查客户端的到期时间(当连接时间达到预定值时,必须强制每个客户端与服务器断开连接)以及一些其他计时器任务。 我考虑2解决方案:
哪种解决方案性能更好? 通常,我应该使用无限循环还是声明许多计时器实例? 还有一件事,您能解释一下操作系统如何管理截止时间吗?
问:哪种解决方案性能更好?
无限循环通常是不好的。 在具有线程相似性的CPU饱和工作器中会发现异常(但似乎不适用于此处)。
问:一般来说,我应该使用无限循环吗
没有
问或声明许多计时器实例?
要不就
std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers;
或类似的:)
问:还有,您能解释一下操作系统如何管理deadlien_timer吗?
计时器在后台使用平台特定的内核事件。 实际上,这意味着,例如,如果您有10个任务在不同的计时器上全部阻塞,则内核将使进程保持睡眠状态(根本不运行),直到第一个任务到期为止。
通常,到目前为止,内核级同步原语是不受CPU限制的工作负载的最快方法。
您是否要求每个客户端超时精确(或几乎)一秒?
我会做第三种方式:
while (true) {
if ( elapsed_one_second() ) {
for each client {
client->check_timeout();
}
}
或者,如果您有事件队列,则可以使用一个计时器触发对所有客户端的检查。
编辑:如果您有大量的计时器,您也可以考虑实现增量队列,并在最早的事件中使用一次性计时器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.