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

infinite loop vs boost::asio::deadline_timer C++ performance

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

  1. 使用 while(true){foreach 客户{检查时间}}
  2. 对于每个客户端,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 绑定工作负载的最快方式。