繁体   English   中英

无限循环与boost :: asio :: deadline_timer C ++性能

[英]infinite loop vs boost::asio::deadline_timer C++ performance

我开发了一个服务器应用程序,可以处理来自客户端的许多连接。 服务器定期向每个客户端发送消息(例如,每1秒发送一次),检查客户端的到期时间(当连接时间达到预定值时,必须强制每个客户端与服务器断开连接)以及一些其他计时器任务。 我考虑2解决方案:

  1. 使用while(true){foreach客户{check time}}
  2. 对于每个客户端,delcare都指定了一个duration_timer并为每个任务调用async_wait,因此它将产生大量的duration_timer实例

哪种解决方案性能更好? 通常,我应该使用无限循环还是声明许多计时器实例? 还有一件事,您能解释一下操作系统如何管理截止时间吗?

问:哪种解决方案性能更好?

无限循环通常是不好的。 在具有线程相似性的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM