Как стать автором
Обновить

Комментарии 14

Филипп: А можете сравнить функционал std::chrono с подмножествами posix_time, local_time из прекрасной библиотекой Jeff Garland-а boost::date_time? Мне кажется что если chrono не поддерживает всех time-related функций из boost::date_time, то рекомендацией по использованию по прежнему должна оставаться библиотека boost-a.

Я совершенно не знаком с бустовской библиотекой. Про chrono написал потому что ее использует Thread support library. Если нужно не только измерение интервалов, то да, лучше выбрать что-то другое.

std::chrono надо сравнивать с boost::chrono и тогда да, они эквивалентны и практически взаимозаменяемы. Обычно этот момент всем трудно дается — то что классы описывающие даты и интервалы времени принадлежат к разным библиотекам.

Кстати, про steady_clock… Сказано, что он должен быть равномерным. Реализация libstdc++ (gcc) использует CLOCK_MONOTONIC который может замедляться или ускоряться под действием adjtime. Не знаете, насколько это вяжется с равномерностью часов? Насколько я понимаю, да, они не скаканут назад, но измеряемые интервалы могут оказаться неравными (при равенстве duration).

Где это сказано? Я вижу лишь упоминания о его монотонности.

Ну я языком я владею плохо. CLOCK_MONOTONIC — тут всё понятно — только возрастает. А steady может переводиться и как равномерный. Или вы про изменение CLOCK_MONOTONIC? То в man clock_gettime. Там есть чисто равномерные часы: CLOCK_MONOTONIC_RAW, на которых не действует adjtime().

Моя формулировка не совсем точна, сейчас поправлю.


Objects of class steady_­clock represent clocks for which values of time_­point never decrease as physical time advances and for which values of time_­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 — монотонные, равномерные и точные. Ничего удивительного, что там все три структуры были синонимами.

Интересно, как там время подводится...

Вы не ошиблись? Я проверил VS 2015 и 2017, заглянул в документацию по 2012 и 2013 и везде:
system_clock::is_steady = false;
system_clock::is_monotonic = false;

Хм...


Часы считаются монотонное Если значение, возвращенное при первом вызове к now(), всегда меньше или равно значение, возвращенное при последующих вызовах для now().
Часы считаются постоянной при монотонное и если времени между соседними тактами является постоянной величиной.

Видимо, я как-то не так понял этот фрагмент.

в gcc 6.3 так, как я написал выше: clock_gettime() + CLOCK_MONOTONIC. В Clang завтра посмотрю, но исходников 4.0 под рукой нет.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории