бесконечный цикл против производительности boost::asio::deadline_timer C++

Я разрабатываю серверное приложение, которое обрабатывает множество подключений от клиентов. Сервер периодически отправляет сообщение каждому клиенту (например, каждую 1 секунду), проверяет время истечения срока действия клиента (каждый клиент должен быть принудительно отключен от сервера, когда время подключения достигает заданного значения) и некоторые другие задачи таймера. Я рассматриваю 2 решения:

  1. используйте while (true) {для клиентов foreach {время проверки}}
  2. для каждого клиента делайте timer_timer и вызывайте async_wait для каждой задачи, чтобы он порождал много экземпляров time_timer

Какое решение лучше для производительности? В общем, должен ли я использовать бесконечный цикл или объявлять много экземпляров таймера? И еще одно. Можете ли вы объяснить, как ОС управляет крайним_таймером?


person Ikarus    schedule 25.08.2015    source источник


Ответы (2)


Вопрос. Какое решение лучше для производительности?

Бесконечные циклы обычно плохи. Исключения можно найти в рабочих процессах, нагружающих ЦП, с привязкой к потокам (но это, похоже, не применимо здесь).

Вопрос. В общем, следует ли использовать бесконечный цикл

No

В. или объявлять много экземпляров таймера?

Или просто

std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers;

или похожие :)

Вопрос. И еще один вопрос: можете ли вы объяснить, как ОС управляет deadlien_timer?

Таймеры используют специфичные для платформы события ядра под капотом. На практике это означает, что если у вас есть, например. 10 задач заблокированы по разным таймерам, ядро ​​​​будет удерживать процесс в спящем состоянии (вообще не работает) до тех пор, пока не истечет срок действия первого.

Примитивы синхронизации на уровне ядра, как правило, являются самым быстрым способом для рабочих нагрузок, не связанных с ЦП, на сегодняшний день.

person sehe    schedule 25.08.2015
comment
Если мой сервер обрабатывает тысячи одновременных клиентов (каждому клиенту нужно несколько экземпляров срока_таймера), то ему необходимо создать огромное количество экземпляров срока_таймера. Есть ли ограничение на количество экземпляров time_timer? - person Ikarus; 25.08.2015
comment
Это будет определено реализацией. Если речь идет действительно об огромных количествах (см. ответ Кальвина), действительно рассмотрите подход «маркировать и развернуть», обменивая точность на использование ресурсов и, возможно, средние (!) скорости ввода-вывода. - person sehe; 25.08.2015

Вам требуется время ожидания каждого клиента ровно (или почти) в одну секунду?

Я бы сделал третий способ:

while (true) {
  if ( elapsed_one_second() ) {
    for each client {
      client->check_timeout();
    }
}

Или, если у вас есть очередь событий, вы делаете один таймер, чтобы запустить проверку всех клиентов.

РЕДАКТИРОВАТЬ: Если у вас огромное количество таймеров, вы также можете рассмотреть возможность реализации дельта-очереди и использовать одноразовый таймер для самого раннего события.

person Non-maskable Interrupt    schedule 25.08.2015
comment
Я хочу, чтобы время было довольно точным, поэтому это решение не подходит - person Ikarus; 25.08.2015
comment
В этом случае вы можете создать дельта-очередь и использовать один таймер, который полностью контролирует сложность. - person Non-maskable Interrupt; 25.08.2015
comment
Я не знаю дельта-очереди, я рассмотрю это решение позже. - person Ikarus; 25.08.2015