Разница между `deadline_timer` и` waitable_timer` в `boost asio`

Чтобы истечь таймер за 5 секунд,
есть ли какая-либо практическая разница между этими двумя?
Является ли какой-либо предпочтительный (производительность, ресурс и т.д.) Другому для этого случая?

[Вариант 1] deadline_timer:

boost::asio::deadline_timer timer(io_service);
timer.expires_from_now(boost::posix_time::seconds(5));

[Вариант 2] waitable_timer (system_timer или steady_timer):

boost::asio::system_timer timer(io_service);
timer.expires_from_now(std::chrono::seconds(5));

PS: Пожалуйста, сосредоточьтесь на сравнении deadline_timer и system_timer, а не system_timer против steady_timer.

Ответ 1

Единственное различие заключается в использовании используемых типов часов.

Начиная с Boost 1.56, < <20 > и basic_waitable_timer используют detail::deadline_timer_service внутри.

Нет никакой разницы в том, как он выполняет ожидание, единственное различие заключается в том, как он выполняет расчет времени.

В своем методе wait() он использует Time_Traits::now(), чтобы проверить, нужно ли ждать больше. Для system_timer it std::chrono::system_clock::now(), а для deadline_timer it boost::posix_time::microsec_clock::universal_time() или boost::posix_time::second_clock::universal_time() в зависимости от наличия часов с высокой точностью (см. time_traits.hpp).

std::chrono::system_clock реализация обеспечивается поставщиком компилятора/стандартной библиотеки, тогда как boost::posix_time::*clock реализуется Boost с использованием доступных системных функций.

Эти реализации, конечно, могут иметь разную производительность и/или точность в зависимости от платформы и компилятора.

Ответ 2

Отличная реакция на аналогичную проблему: fooobar.com/info/496100/...

В основном, основное отличие состоит в том, что если вы ожидаете каких-либо внешних изменений в системных часах, вы должны скорее использовать stable_timer - задержка deadline_timer будет зависеть от этих изменений