Почему являются gettimeofday () интервалами, иногда отрицательными?

У меня есть экспериментальная библиотека, уровень которой я пытаюсь измерить. Чтобы сделать это, я записал следующее:

struct timeval begin;
gettimeofday(&begin, NULL);
{
    // Experiment!
}
struct timeval end;
gettimeofday(&end, NULL);

// Print the time it took!
std::cout << "Time: " << 100000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;

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

Time: 226762
Time: 220222
Time: 210883
Time: -688976

Что продолжается?

5
задан Andres Jaan Tack 6 May 2010 в 10:26
поделиться

4 ответа

Вы допустили опечатку. Исправленная последняя строка (обратите внимание на количество нулей):

std::cout << "Time: " << 1000000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;

BTW, timersub - это встроенный метод для получения разницы между двумя временными интервалами.

6
ответ дан 18 December 2019 в 11:54
поделиться

std :: cout << "Time:" << 100000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std :: endl;

Как уже отмечалось, там составляют 1000000 мкс в секунду, а не 100000.

В общем, вам может потребоваться знать о нестабильности синхронизации на компьютерах. Такие процессы, как ntpd , могут изменять время тактов, что приводит к неправильному дельта-времени. Возможно, вас заинтересуют такие средства POSIX, как timer_create .

3
ответ дан 18 December 2019 в 11:54
поделиться

Библиотеки реального времени posix лучше подходят для измерения интервалов с высокой точностью. Вы действительно не хотите знать текущее время. Вы просто хотите знать, сколько времени прошло между двумя точками. Вот для чего нужны монотонные часы.

struct timespec begin;
clock_gettime( CLOCK_MONOTONIC, &begin );
{
    // Experiment!
}
struct timespec end;
clock_gettime(CLOCK_MONOTONIC, &end );

// Print the time it took!
std::cout << "Time: " << double(end.tv_sec - begin.tv_sec) + (end.tv_nsec - begin.tv_nsec)/1000000000.0 << std::endl;

При ссылке нужно добавить -lrt .

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

4
ответ дан 18 December 2019 в 11:54
поделиться

do

$ time ./proxy-application

next time

-1
ответ дан 18 December 2019 в 11:54
поделиться