【问题标题】:Time measure without using system clock不使用系统时钟的时间测量
【发布时间】:2014-01-02 16:05:28
【问题描述】:

有没有办法在不使用系统时钟的情况下测量 linux/unix 中的经过时间? 问题是系统时钟在某些情况下会发生变化,并且由timegettimeofday 或其他类似的东西测量的经过时间会给出不正确的结果。

我正在考虑创建单独的线程,它在内部执行带有sleep(100) 的循环并计算重复次数。

有更好的解决方案吗?

【问题讨论】:

  • "在内部执行带有sleep(100) 的循环并计算重复次数"。 sleep 被允许无缘无故延迟返回(好吧,你的进程没有理由可以看到),所以这不一定有效。
  • 你说 time 和 gettimeofday 不准确的依据是什么?
  • 来自man gettimeofday - 自 1970 年 1 月 1 日午夜(0 小时)以来的时间以 微秒 表示。

标签: c++ linux time measure elapsedtime


【解决方案1】:

std::chrono::steady_clock 可用于测量时间,并考虑系统时钟的变化。

【讨论】:

  • 要添加到这个答案,睡觉有sleep_forsleep_until
  • 看起来是解决问题的好方法,但我们使用的 gcc 版本似乎还不支持它。
【解决方案2】:

使用单调时间,表示从某个时间点开始的时间:http://linux.die.net/man/3/clock_gettime

int64_t get_monotonic_timestamp(void)
{
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    return (int64_t)ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
}

【讨论】:

【解决方案3】:

sleep(或变体)测量经过的时间是个坏主意。您的线程可以在经过睡眠时间后随时唤醒,因此这肯定是不准确的。

【讨论】:

  • 我不需要它非常准确,但是当系统时间发生变化时,我会得到数千小时的经过时间,而不是几秒钟。
  • 这实际上并没有回答问题。您拒绝问题中提供的解决方案,但没有提供您自己的任何其他解决方案。
【解决方案4】:

对于时间延迟,您可以使用例如select.

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2013-12-25
    相关资源
    最近更新 更多