我试图在几微秒内做一个计时器,但它不能正常工作。
#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.有什么建议吗?
答案 0 :(得分:1)
我不确定你要测量的是什么,但我猜CLOCK_PROCESS_CPUTIME_ID
是错误的计时器,如果你想测量一些经过的时间,你可能需要CLOCK_MONOTONIC
。看一下显示clock_gettime
的不同时钟之间差异的similar stackoverflow question。
也就是说,要获得全部时间,您必须将每个测量的tv_sec
和tv_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)
两件事。
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