手册页将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 存在的首要原因:性能!