C ++计时器,以微秒为单位

时间:2014-04-20 18:36:57

标签: c++ time timer

我试图在几微秒内做一个计时器,但它不能正常工作。

#include <time.h>
#include <iostream>
#include <unistd.h>

using namespace std;

int main ()
{
    struct timespec start_time;
    struct timespec end_time;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time);
    usleep(5000);
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time);
    cout << "START: " << (start_time.tv_nsec/1000) << endl;
    cout << "END: " << (end_time.tv_nsec/1000) << endl;
    cout << "DIFF: " << (end_time.tv_nsec - start_time.tv_nsec) /1000 << endl;

    return 0;
}

结果如下:

START: 3586
END: 3630
DIFF: 43

我需要DIFF大约5000.有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我不确定你要测量的是什么,但我猜CLOCK_PROCESS_CPUTIME_ID是错误的计时器,如果你想测量一些经过的时间,你可能需要CLOCK_MONOTONIC。看一下显示clock_gettime的不同时钟之间差异的similar stackoverflow question

也就是说,要获得全部时间,您必须将每个测量的tv_sectv_nsec(当然首先转换为tv_sec到纳秒),然后减去该总数,类似的东西:

uint64_t startNs = start_time.tv_sec * 1000 * 1000 * 1000 + start_time.tv_nsec;
uint64_t endNs = end_time.tv_sec * 1000 * 1000 * 1000 + end_time.tv_nsec;
uint64_t diffNs = endNs - startNs;
uint64_t diffMicro = diffNs / 1000;

如果您使用的是C ++ 11,最好使用chrono命名空间中的一些high level class

答案 1 :(得分:1)

两件事。

  1. 猜猜你需要CLOCK_REALTIME
  2. timespec有两个组成部分 - 在进行减法时需要考虑到这两个因素

答案 2 :(得分:1)

尝试 clock_gettime(CLOCK_REALTIME,&amp; start) clock_gettime(CLOCK_REALTIME,&amp; stop)

您还需要使用timespec结构的'tv_sec'部分。

时间=((stop.tv_sec - start.tv_sec)+(double)(stop.tv_nsec - start.tv_nsec)/ 1e9)* 1000; // im ms