2014-01-02 4 views
1

Есть ли способ измерить прошедшее время в linux/unix без использования системных часов? Проблема в том, что системные часы меняются в некоторых ситуациях и прошедшее время, измеренное time или gettimeofday, или что-то еще подобное дает неверный результат.Измерение времени без использования системных часов

Я собираюсь создать отдельный поток, который выполняет цикл с sleep(100) внутри и подсчитывает количество повторений.

Любые лучшие решения?

+0

«выполняет цикл с' сном (100) 'внутри и подсчитывает количество повторений». 'sleep' разрешено возвращаться поздно без причины (ну, нет причин, чтобы ваш процесс мог видеть), так что это не обязательно работает. –

+3

И на каком основании вы говорите, что время и gettimeofday являются неточными? – doron

+0

От 'man gettimeofday' - время выражается в ** секундах ** и ** микросекундах ** с полуночи (0 час), 1 января 1970 года. –

ответ

4

использования монотонно время, которое представляет время, поскольку какие-то момент: http://linux.die.net/man/3/clock_gettime

int64_t get_monotonic_timestamp(void) 
{ 
    struct timespec ts; 
    clock_gettime(CLOCK_MONOTONIC, &ts); 
    return (int64_t)ts.tv_sec * 1000000 + ts.tv_nsec/1000; 
} 
+0

Или даже лучше 'CLOCK_BOOTTIME'. –

+0

Я собирался сказать в основном то же самое; на вопрос уже ответили по аналогичному вопросу, http://stackoverflow.com/a/2958359/2696854 – Keith4G

+0

Большое спасибо! Это работает так, как ожидалось. – axe

2

Измерение прошедшего времени с sleep (или варианты) - плохая идея. Ваша нить может проснуться в любое время после истечения времени сна, поэтому это обязательно будет неточным.

+0

Мне не нужно, чтобы это было очень точно, но когда система временные изменения. Я получаю тысячи часов как прошедшее время, а не пару секунд. – axe

+0

@axe 'man gettimeofday' –

+1

Это на самом деле не отвечает на вопрос. Вы отклоняете решение, предлагаемое в вопросе, но не предложили никаких других решений. –

1

Задержка времени, вы можете использовать, например. select.

6

std::chrono::steady_clock может использоваться для измерения времени и учета изменений в системных часах.

+1

Чтобы добавить к этому ответу, для сна есть ['sleep_for'] (http://en.cppreference.com/w/cpp/thread/sleep_for) и [' sleep_until'] (http: //en.cppreference. ком/ж/CPP/резьба/sleep_until). –

+0

Похоже, это отличное решение проблемы, но похоже, что она еще не поддерживается версией gcc, которую мы используем. – axe