CLOCK_MONOTONIC 和 CLOCK_MONOTONIC_COARSE 是否具有相同的基数?

ASh*_*lly 4 c linux clock

手册页将clock_gettime()CLOCK_MONOTONIC_COARSE 描述为:

CLOCK_MONOTONIC 的更快但不太精确的版本。当您需要非常快但不需要细粒度的时间戳时使用。

一个人成为另一个人的“版本”意味着什么?

假设我将 CLOCK_MONOTONIC 值截断为与粗略值相同的精度,我可以有效地将一个值与另一个值进行比较吗?

小智 5

简短的答案是肯定的(至少对于 Linux 来说!),你可以比较它们,计算延迟等等......

精度可能是不太精确的,很可能是粗略的。

看这个小程序:

#include <time.h>
#include <stdio.h>

int main()
{
    int ret;
    struct  timespec res;

    ret = clock_getres(CLOCK_MONOTONIC, &res);
    if (0 != ret)
        return ret;
    printf("CLOCK_MONOTONIC resolution is: %ld sec, %ld nsec\n", (long)res.tv_sec, (long)res.tv_nsec);

    ret = clock_getres(CLOCK_MONOTONIC_COARSE, &res);
    if (0 != ret)
        return ret;
    printf("CLOCK_MONOTONIC_COARSE resolution is: %ld sec, %ld nsec\n", (long)res.tv_sec, (long)res.tv_nsec);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它返回(Ubuntu 20.04 - 64位 - 内核5.4)

CLOCK_MONOTONIC resolution is: 0 sec, 1 nsec
CLOCK_MONOTONIC_COARSE resolution is: 0 sec, 4000000 nsec
Run Code Online (Sandbox Code Playgroud)

所以 MONOTONIC 具有纳秒精度,COARSE 具有 4 毫秒精度。

与上面的评论不同,我相反建议在您需要的时间允许的情况下使用 COARSE版本。

用户程序中对时钟的调用非常频繁,因此它们在vDSO中占有一席之地

当您使用 COARSE 版本时,您的系统调用恰好为零,并且速度与您的机器运行几条指令的速度一样快。感谢 vDSO,您的程序在与 COARSE 通话期间完全停留在“用户区”。对于其他类型的时钟,您将有一些系统调用,以及对硬件的潜在访问。所以至少切换到“内核”并返回“用户态”。

如果您的程序只需要十几次调用,这当然具有零重要性,但相反,如果程序严重依赖时钟,则它可以节省大量时间。这就是为什么 vDSO 存在的首要原因:性能!

  • 首先定义您的计时所需的准确性。够秒了吗,需要毫秒、微秒等吗?
  • 请记住,除非您正在修改 RT 系统,否则时间是一个相对值!想象一下,您调用了clock_gettime,并且在返回后您的线程立即因任何内核业务而被中断:您获得的准确性是多少?这正是2001年太空漫游中击败HAL的著名问题:“现在几点了?”。
  • 由此您可以得出您需要的时钟类型。
  • 您可以混合 MONOTONIC 和它的 COARSE 版本,并且仍然计算延迟或比较(这是原来的问题)。但当然,精度是不太精确的。
  • 单调最适合进行时间延迟和比较,因为它们不依赖于实时(如您的手表显示)当用户更改实际时间时,它们不会更改。
  • 相反,如果您需要显示事件发生的时间(对用户有意义),请不要使用monotonic