如何获得与系统时间无关的时差(毫秒)?

时间:2017-06-29 13:43:43

标签: c++ linux

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

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

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

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

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

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

还有其他方法可以实现吗?

我们的性能测试(用于/ proc /正常运行时间比较),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毫秒

2 个答案:

答案 0 :(得分:7)

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

  

std::chrono::steady_clock代表单调时钟。物理时间向前移动时,此时钟的时间点不会减少。此时钟与挂钟时间无关(例如,它可能是自上次重启后的时间),最适合测量间隔。

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

答案 1 :(得分:3)

执行所需操作的低级系统原语是clock_gettime CLOCK_MONOTONIC&#34; clockid&#34;。

  

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

(正在&#34;受到adjtime(3)和NTP&#34执行的增量调整的影响,几乎可以肯定你想要的。)

此函数在<time.h>中声明,并且在当前版本的GNU libc中,默认情况下可以访问。对于旧版本,您可能需要在包含任何系统标头(不包括_POSIX_C_SOURCE之前)之前将200809L定义为大于或等于time.h的值,您可能还需要将您的计划与-lrt

相关联

clock_gettime返回struct timespec,可以表示单个纳秒的差异;实际的精度通常会有所降低,但你应该能够依靠毫秒级的精度,特别是如果一个程序能够实现这一目标。系统时钟(例如ntpd)正在运行。