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

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

本文关键字:timer c++ 性能 asio vs boost 无限循环 deadline      更新时间:2023-10-16

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

  1. 使用while(true){foreach客户端{检查时间}}
  2. 为每个客户端指定一个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();
    }
}

或者如果你有事件队列,你做一个定时器来触发所有客户端的检查。

编辑:如果你有大量的计时器,你也可以考虑实现增量队列,并使用一次性计时器来处理最早的事件。