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

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

最佳答案

我不确定你要测量什么,但我猜 CLOCK_PROCESS_CPUTIME_ID 是错误的计时器,如果你想测量一些耗时,你可能需要 CLOCK_MONOTONIC时间。看看 similar stackoverflow question这显示了 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,最好使用一些 high level class来自 chrono 命名空间。

关于C++ 定时器(以微秒为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23186201/

相关文章:

c++ - 在枚举类型上使用 std::max 是不好的做法吗?

ruby-on-rails - ruby /Rails : get time in closest 15-min increment

time - 为什么libc中没有gmtime的反函数?

linux - 您如何找到启动所需的时间?

javascript - 如何使 JavaScript 变量动态地用于计时器

java - 如何在运行时将 TimerTask 提交给另一个 Timer

c++ - 为什么这个模板推理失败

c++ - 使用显式非类型参数和隐式类型参数调用模板函数

c++ - 断言两个指针都指向 NULL 在 delete() 之后没有发生

java - WebSphere 集群上带有 TimerManager 的单例