c ++ точный таймер time.h boost :: posix_time - PullRequest
1 голос
/ 04 марта 2012

Я пытаюсь создать таймер для профилирования некоторых функций.Например,

#include <date_time/posix_time/posix_time.hpp>

boost::posix_time::ptime t1, t2;
t1 = boost::posix_time::microsec_clock::local_time();
boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
t2 = boost::posix_time::microsec_clock::local_time();

std::cout << to_simple_string(t1) << std::endl;
std::cout << to_simple_string(t2) << std::endl;

Вывод, который я получаю, такой:

2012-Mar-04 08:21:24.760019
2012-Mar-04 08:21:25.760577

Фактическое время, прошедшее 1 секунда и 558 микросекунд, так или иначе, я могу улучшить эту точность доскажем, менее 1 микросекунды?

Я также пробовал что-то подобное с линкером -lrt.

#include <time.h>
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &timer_start);
boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
clock_gettime(1CLOCK_PROCESS_CPUTIME_ID, &timer_end);

Но компилятор возвращает семантическую ошибку для CLOCK_PROCESS_CPUTIME_ID.Сообщение об ошибке следующее.

Description Resource    Path    Location    Type
Symbol 'CLOCK_PROCESS_CPUTIME_ID' could not be resolved _OVERVIEW.cpp   /FUTETP/BACKEND line 32 Semantic Error

1 Ответ

1 голос
/ 04 марта 2012

Пожалуйста, имейте в виду две вещи:

  1. sleep() и другие чувствительные ко времени команды могут быть неточными по нескольким причинам (загрузка системы и т. Д.). Вы никогда не получите с точностью до 1 микросекунды. 500 микросекунд не так уж плохо для синхронизации sleep()
  2. Если ваше системное время контролируется NTP и т. Д., И часы меняются во время вашей временной операции, вы увидите . Если время откатывается, можно получить отрицательное (или большое число без знака).

Кстати, я не уверен, какой метод использует Boost, чтобы получить время, но рассмотрим gettimeofday(2) из sys/time.h (или более новый clock_gettime() из time.h). Возвращает время с полуночи 1 января 1970 года. Запишите время до и после и вычтите. Вот пример gettimeofday().

#include <sys/time.h>

#include <stdio.h>
#include <unistd.h>

unsigned int
timeDif(
    struct timeval *before,
    struct timeval *after)
{
    return ((after->tv_sec * 1000000 + after->tv_usec) - 
        (before->tv_sec * 1000000 + before->tv_usec));
}

int
main(
    int argc,
    char *argv[]) {
    struct timeval before, after;

    gettimeofday(&before, NULL);
    sleep(1);
    gettimeofday(&after, NULL);

    printf("Elapsed time: %u microseconds\n", timeDif(&before, &after));

    return (0);
}
...