在C++/boost中,用*nix检索时间的最高效的方法是什么

What is the most performant way to retrieve time in *nix in C++/boost?

本文关键字:时间 检索 高效 是什么 方法 nix C++ boost      更新时间:2023-10-16

我知道这个问题有太多的变量,无法有一个单一的答案,但如果您能帮助我了解选项,我将不胜感激。

我的应用程序需要从网络接收大量事件,并且需要在每条消息上至少以毫秒的分辨率"标记"到达时间,以便稍后根据这些时间戳进行大量计算。

我过去的经验告诉我,以高速率获得时钟时间是一个性能杀手,因为它们转化为系统/内核调用。在C++中的Unix环境中是否存在"不太糟糕的选项"?

作为一个起点,我现在使用"boost::posix_time::microsec_clock::local_time()"

,它达到了微秒分辨率(我不需要),这给了我一个绝对时间(原则上,我可以对任何历元进行相对偏移)。

我最好的选择是什么?

我不能说哪个更快,但你有没有想过你到底需要什么样的时间?

  • clock(3):CPU滴答……对性能测试很有用,但对网络调用或时间戳的计时不有用
  • clock_gettime(3) CLOCK_MONOTONIC:不可更改的时间…对定时网络呼叫很有用
  • gettimeofday(2):墙时间…对时间戳和性能测试很有用

确保你选择的任何时间方法都符合你的需求。

以下内容以微秒为单位获取时间戳(您认为这对您来说太多了)。调整除法/乘法很容易得到微秒:

const uint32_t getTime()
{
    struct timeval  tv;
    struct timezone tz;
    struct tm      *tm;
    gettimeofday(&tv, &tz);
    tm = localtime(&tv.tv_sec);
    return (tm->tm_hour * 3600000000/*3600 * 1000 * 1000*/) +
    (tm->tm_min * 60000000/*60 * 1000 * 1000*/) +
    (tm->tm_sec * 1000000/*1000 * 1000*/) +
    (tv.tv_usec);
}