У меня есть экспериментальная библиотека, уровень которой я пытаюсь измерить. Чтобы сделать это, я записал следующее:
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
Что продолжается?
Вы допустили опечатку. Исправленная последняя строка (обратите внимание на количество нулей):
std::cout << "Time: " << 1000000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;
BTW, timersub
- это встроенный метод для получения разницы между двумя временными интервалами.
std :: cout << "Time:" << 100000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std :: endl;
Как уже отмечалось, там составляют 1000000 мкс в секунду, а не 100000.
В общем, вам может потребоваться знать о нестабильности синхронизации на компьютерах. Такие процессы, как ntpd
, могут изменять время тактов, что приводит к неправильному дельта-времени. Возможно, вас заинтересуют такие средства POSIX, как timer_create
.
Библиотеки реального времени 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 или пользователь обманывают системное время.