clock_gettime()
的手册页将CLOCK_MONOTONIC_COARSE描述为:
一个更快但不太精确的CLOCK_MONOTONIC版本。当您需要非常快,但不是细粒度时间戳时使用。
一个是另一个的“版本”意味着什么?
假设我将CLOCK_MONOTONIC值截断到与粗值相同的精度,我能有效地比较其中一个吗?
发布于 2019-10-01 18:00:41
下面是列出Posix/Linux时钟的不同“版本”的手册页:
获得时间 glibc和Linux内核的最新版本支持以下时钟:
正如您在上面看到的,CLOCK_MONOTONIC_COARSE是在Linux2.6.32中引入的。以下是基本原理(以及特定的源修补程序):
https://lwn.net/Articles/347811/ 与一些想要非常快但不是细粒度时间戳的应用程序编写人员交谈时,我决定尝试实现一个新的clock_ids to clock_gettime():CLOCK_REALTIME_COARSE和CLOCK_MONOTONIC_COARSE,它在最后一个滴答处返回时间。这非常快,因为我们不需要访问任何硬件(如果您使用的是类似于acpi_pm时钟源的东西,这会非常痛苦),我们甚至可以使用vdso clock_gettime()方法来避免syscall。唯一的好处是你只能得到低分辨率的刻度时间分辨率。 这不是什么新想法,我知道Ingo在-rt树中有一个补丁,使得()在vsyscall64 sysctrl设置为2时返回粗粒度时间,但是这会影响到系统上的所有应用程序。 使用这种方法,应用程序可以为自己选择合适的速度/粒度折衷。 谢谢-john
增编:
问:使用CLOCK_MONOTONIC_COARSE或CLOCK_REALTIME_COARSE会给哪些用例带来好处?
答:在Linux2.6.32时间框架(2010-2011年)中,"...application工作负载(特别是数据库和金融服务应用程序)执行非常频繁的gettimeofday或类似的时间函数调用“:
Redhat Enterprise: 2.6。一日加速比 许多应用程序工作负载(特别是数据库和金融服务应用程序)执行非常频繁的gettimeofday或类似的时间函数调用。优化这个调用的效率可以提供主要的好处。
发布于 2020-07-28 22:03:15
CLOCK_MONOTONIC_COARSE
使用与CLOCK_MONOTONIC相同的时间基(但与CLOCK_MONOTONIC_RAW
相比没有)。具体来说,它们都使用wall_to_monotonic
来转换从tk的xtime派生的值。RAW使用完全不同的时间源。
请记住,CLOCK_MONOTONIC_COARSE
每勾只更新一次(因此通常大约是1ms,但请clock_getres()
确认)。如果这种准确性足够好,那么一定要减去你的时钟值。
发布于 2021-10-28 16:36:53
简单的回答是是(至少对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;
}
它返回(Ubuntu 20.04 -64位-内核5.4)
CLOCK_MONOTONIC resolution is: 0 sec, 1 nsec
CLOCK_MONOTONIC_COARSE resolution is: 0 sec, 4000000 nsec
所以单调有纳秒的精度,粗的有4毫秒的精度。
与上面的评论不同,相反,建议在您需要的时间允许时使用粗略的版本。
对时钟的调用在用户程序中是如此频繁,以至于他们在vDSO中占有一席之地。
当您使用粗版本时,您拥有完全为零的系统调用,并且它的速度与您的机器能够运行几条指令一样快。多亏了vDSO,您的程序在调用过程中完全停留在"userland“中。与其他类型的时钟,您将有一些系统调用,并可能访问硬件。因此,至少要切换到“内核”,然后返回到"userland“。
当然,如果您的程序只需要12次调用,那么这个问题就没有任何意义了,但是如果程序严重依赖于时钟,那么它可以节省大量的时间。这就是为什么,vDSO首先存在:性能!
https://stackoverflow.com/questions/58189790
复制相似问题