C++计时器(以微秒为单位)

C++ timer in microseconds

本文关键字:为单位 计时器 C++      更新时间:2023-10-16

我正在尝试以微秒为单位进行计时器,但它不太起作用。

#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左右。有什么建议吗?

我不确定你想测量什么,但我猜CLOCK_PROCESS_CPUTIME_ID是错误的计时器,如果你想测量一些经过的时间,你可能想要CLOCK_MONOTONIC。看看一个类似的stackoverflow问题,它显示了clock_gettime的不同时钟之间的差异。

也就是说,要获得完整的时间,你必须将每次测量的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命名空间中的一些高级类。

两件事。

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

尝试clock_gettime(clock_REALTIME,&start)clock_gettime(clock_REALTIME,&stop)

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

时间=((stop.tv_sec-start.tv_sec)+(双)(stop.tw_nsec-start.tv.sec)/1e9)*1000//im ms