Комментарии 14
Я совершенно не знаком с бустовской библиотекой. Про chrono написал потому что ее использует Thread support library. Если нужно не только измерение интервалов, то да, лучше выбрать что-то другое.
Кстати, про steady_clock
… Сказано, что он должен быть равномерным. Реализация libstdc++ (gcc) использует CLOCK_MONOTONIC
который может замедляться или ускоряться под действием adjtime. Не знаете, насколько это вяжется с равномерностью часов? Насколько я понимаю, да, они не скаканут назад, но измеряемые интервалы могут оказаться неравными (при равенстве duration).
Где это сказано? Я вижу лишь упоминания о его монотонности.
Ну я языком я владею плохо. CLOCK_MONOTONIC — тут всё понятно — только возрастает. А steady может переводиться и как равномерный. Или вы про изменение CLOCK_MONOTONIC? То в man clock_gettime
. Там есть чисто равномерные часы: CLOCK_MONOTONIC_RAW
, на которых не действует adjtime()
.
Моя формулировка не совсем точна, сейчас поправлю.
Objects of classsteady_clock
represent clocks for which values oftime_point
never decrease as physical time advances and for which values oftime_point
advance at a steady rate relative to real time. That is, the clock may not be adjusted.
advance at a steady rate relative to real time. That is, the clock may not be adjusted.
собственно вот оно. А это из man clock_gettime
:
CLOCK_MONOTONIC
Clock that cannot be set and represents monotonic time since some unspecified starting point. This clock is not affected by discontinuous jumps in the system time (e.g., if the system administrator manually changes
the clock), but is affected by the incremental adjustments performed by adjtime(3) and NTP.
Раньше были часы std::chrono::monotonic_clock
. А VS сначала просто обернули system_clock
:
class steady_clock
: public system_clock
{ // wraps monotonic clock
public:
static const bool is_monotonic = true; // retained
static const bool is_steady = true;
};
typedef steady_clock monotonic_clock; // retained
Сейчас в VS вроде нормально. Можете проверить последнюю версию gcc и boost::chrono::steady_clock.
Ну, согласно документации, в VS system_clock — монотонные, равномерные и точные. Ничего удивительного, что там все три структуры были синонимами.
Интересно, как там время подводится...
system_clock::is_steady = false;
system_clock::is_monotonic = false;
Хм...
Часы считаются монотонное Если значение, возвращенное при первом вызове к now(), всегда меньше или равно значение, возвращенное при последующих вызовах для now().
Часы считаются постоянной при монотонное и если времени между соседними тактами является постоянной величиной.
Видимо, я как-то не так понял этот фрагмент.
в gcc 6.3 так, как я написал выше: clock_gettime()
+ CLOCK_MONOTONIC. В Clang завтра посмотрю, но исходников 4.0 под рукой нет.
Основные концепции библиотеки chrono (C++)