【问题标题】:How to get time differences (milliseconds) independent of system time?如何获得独立于系统时间的时间差(毫秒)?
【发布时间】:2017-06-29 13:43:43
【问题描述】:

我需要在 Linux (Ubuntu 14) 上以毫秒为单位计算时间差。

它需要独立于系统时间,因为应用程序可能会在执行过程中更改它(它根据从 GPS 接收到的数据设置系统时间)。

我检查了clock 函数,它对我们不起作用,因为它返回程序消耗的处理器时间,我们需要实时。

sysinfo(如 question 中提到的)返回自启动以来的秒数,同样,我们需要毫秒数。

根据我们的测试,从 /proc/uptime(如 question 中提到的)读取似乎很慢(考虑到我们需要毫秒并且重复调用此函数)。

我们可以使用 C++11,但我认为 std::chrono 也与系统时间有关(如果我错了,请纠正我)。

有没有其他方法可以做到这一点?


我们的性能测试(用于 /proc/uptime 比较),100 万次重复调用:

gettimeofday:

(不是我们需要的,因为它取决于系统时间)

#include <sys/time.h>

unsigned int GetMs(){
    unsigned int ret = 0;
    timeval ts;
    gettimeofday(&ts,0);
    static long long inici = 0;
    if (inici==0){
        inici = ts.tv_sec;
    }
    ts.tv_sec -= inici;
    ret = (ts.tv_sec*1000 + (ts.tv_usec/1000));
    return ret;
}

时钟:

(无效,返回应用程序使用的刻度,不是实时的)

#include <time.h>
unsigned int GetMs(){
    unsigned int ret = 0;
    clock_t t;
    t = clock();
    ret = t / 1000;
    return ret;
}

正常运行时间:

#include <fstream>
unsigned int GetMs(){
    unsigned int ret = 0;
    double uptime_seconds;
    if (std::ifstream("/proc/uptime", std::ios::in) >> uptime_seconds) {
        ret = (int) (1000 * uptime_seconds);
    }
}

结果:

  • gettimeofday:31 毫秒
  • 时钟:153 毫秒
  • 正常运行时间:6005 毫秒

【问题讨论】:

    标签: c++ linux


    【解决方案1】:

    你想要的是std::chrono::steady_clock

    std::chrono::steady_clock 类表示单调时钟。这个时钟的时间点不能随着物理时间的推移而减少。此时钟与挂钟时间无关(例如,可以是上次重启后的时间),最适合测量间隔。

    如果您需要支持 C++98/03 环境,您也可以使用boost:steady_clock

    【讨论】:

    • 感谢您的回答。它完美地工作并且不依赖于系统时钟,这满足了我的要求。但是,根据我的测试,我接受@zwol 的答案是更快。在我的嵌入式设备上,1000000 次重复调用,std::chrono::steady_clock 耗时 3523 ms,clock_gettime with CLOCK_MONOTONIC 耗时 2184 ms。
    • @PauGuillamon 没问题。很高兴能提供帮助。
    【解决方案2】:

    执行您想要的操作的低级系统原语是clock_gettimeCLOCK_MONOTONIC“clockid”。

    CLOCK_MONOTONIC:无法设置的时钟,表示自某个未指定起点以来的单调时间。该时钟不受系统时间不连续跳跃的影响(例如,如果系统管理员手动更改时钟),但会受到 adjtime(3) 和 NTP 执行的增量调整的影响。

    (“受到 adjtime(3) 和 NTP 执行的增量调整的影响”几乎可以肯定是您想要的。)

    此函数在&lt;time.h&gt; 中声明,并且在当前版本的 GNU libc 中默认可访问。对于旧版本,您可能需要在包含 any 系统标头之前将 _POSIX_C_SOURCE 定义为大于或等于 200809L 的值(不仅仅是在包含 time.h 之前),您可能还需要将您的程序链接到-lrt

    clock_gettime返回一个struct timespec,可以表示单个纳秒的差异;实际精度通常稍低,但您应该能够依靠毫秒精度,尤其是在“规范”系统时钟的程序(例如 ntpd)正在运行时。

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多