2012-03-04 3 views
1

Я пытаюсь создать таймер для профилирования некоторых функций. Например,C++ точный таймер time.h boost :: posix_time

#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 
+0

Не могли бы вы показать, как вы компилируете? (Полная командная строка компилятора) И какую ОС вы используете? – Mat

+3

Вы, кажется, считаете, что это таймер, который является неточным. Вероятно, в вызове 'sleep' есть гораздо большая неточность. – interjay

+0

@Mat, я использую eclipse на Fedora 15, gnu gcc 4.6. – 2607

ответ

1

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

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

Кстати, я не уверен, что метод подталкивания использует, чтобы получить время, но считают 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); 
} 
+0

Благодарим вас за ответ. Я не знал, что трудно получить высокую точность в отношении временных функций, таких как sleep(). Я использовал boost :: posix_time раньше и получил ошибку точности около 500 мсек, поэтому я переключился на time.h. – 2607