简体   繁体   English

C ++准确的计时器time.h boost :: posix_time

[英]c++ accurate timer time.h boost::posix_time

I am trying to create a timer to profile some functions. 我正在尝试创建一个计时器来分析某些功能。 For example, 例如,

#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;

The output I get is this, 我得到的输出是这样,

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

The actual time elapsed is 1 second and 558 micro second, is there anyway that I can improve this accuracy to say under 1 microsecond? 实际经过的时间是1秒和558微秒,反正我可以提高这种精度,比如说在1微秒以下吗?

I also tried something like this, with linker -lrt. 我也使用链接器-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);

But the compiler returns a semantic error for CLOCK_PROCESS_CPUTIME_ID. 但是编译器返回CLOCK_PROCESS_CPUTIME_ID的语义错误。 The error message is as follow. 错误消息如下。

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

Please keep in mind two things: 请记住两件事:

  1. sleep() and other time-sensitive commands could be inaccurate for several reasons (system load, etc.). 由于多种原因(系统负载等), sleep()和其他对时间敏感的命令可能不准确。 You will never get within 1 microsecond accuracy. 您将永远无法获得1微秒的精度。 500 microseconds isn't too bad for timing sleep() 500毫秒对于计时sleep()来说还不错
  2. If your system time is controlled by NTP, etc. and the clock is changed during your timing operation, you will see this. 如果您的系统时间是由NTP等控制的,并且在计时操作期间更改了时钟, 则会看到此信息。 If the time is rolled back, it is possible to obtain a negative (or large unsigned number). 如果时间回滚,则有可能获得负数(或较大的无符号数)。

By the way, I'm unsure of what method Boost is using to get the time, but consider gettimeofday(2) from sys/time.h (or newer clock_gettime() from time.h ). 顺便说一句,我不确定Boost正在使用哪种方法获取时间,但是请考虑从sys/time.h (或从time.h更新的clock_gettime()获取gettimeofday(2) )。 It returns the time since midnight Jan 1, 1970. Record the time before and after and subtract. 它返回从1970年1月1日午夜开始的时间。记录前后的时间并减去。 Here's an example of gettimeofday() . 这是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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM