首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CLOCK_MONOTONIC和CLOCK_MONOTONIC_COARSE有相同的基础吗?

CLOCK_MONOTONIC和CLOCK_MONOTONIC_COARSE有相同的基础吗?
EN

Stack Overflow用户
提问于 2019-10-01 17:37:09
回答 3查看 3.9K关注 0票数 3

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

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

一个是另一个的“版本”意味着什么?

假设我将CLOCK_MONOTONIC值截断到与粗值相同的精度,我能有效地比较其中一个吗?

EN

回答 3

Stack Overflow用户

发布于 2019-10-01 18:00:41

下面是列出Posix/Linux时钟的不同“版本”的手册页:

获得时间 glibc和Linux内核的最新版本支持以下时钟:

  • CLOCK_REALTIME 测量真实时间(即挂钟)的全系统时钟.设置这个时钟需要适当的特权。该时钟受系统时间中的不连续跳转(例如,如果系统管理员手动更改时钟)和由adjtime(3)和NTP执行的增量调整的影响。
  • CLOCK_REALTIME_COARSE (因为Linux2.6.32;Linux专用) 一个更快但不太精确的CLOCK_REALTIME版本。当您需要非常快,但不是细粒度时间戳时使用。
  • CLOCK_MONOTONIC 由于某个未指定的起点而不能设置并表示单调时间的时钟。该时钟不受系统时间中不连续跳转的影响(例如,如果系统管理员手动更改时钟),而是受adjtime(3)和NTP执行的增量调整的影响。
  • CLOCK_MONOTONIC_COARSE (因为Linux2.6.32;Linux专用) 一个更快但不太精确的CLOCK_MONOTONIC版本。当您需要非常快,但不是细粒度时间戳时使用。
  • CLOCK_MONOTONIC_RAW (自Linux2.6.28;Linux专用)类似于CLOCK_MONOTONIC,但提供了对不受NTP调整或adjtime(3)执行的增量调整的原始基于硬件的时间的访问。
  • CLOCK_BOOTTIME (自Linux2.6.39;Linux专用)与CLOCK_MONOTONIC相同,但它还包括系统暂停的任何时间。这允许应用程序获得一个暂停感知的单调时钟,而不必处理CLOCK_REALTIME的复杂问题,如果使用指定的日期(2)更改时间,则可能会出现中断。
  • 来自CPU的CLOCK_PROCESS_CPUTIME_ID高分辨率每进程计时器.
  • CLOCK_THREAD_CPUTIME_ID线程专用CPU-时间时钟.

正如您在上面看到的,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或类似的时间函数调用。优化这个调用的效率可以提供主要的好处。

票数 4
EN

Stack Overflow用户

发布于 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()确认)。如果这种准确性足够好,那么一定要减去你的时钟值。

票数 3
EN

Stack Overflow用户

发布于 2021-10-28 16:36:53

简单的回答是(至少对Linux!),您可以比较它们、计算延迟等等.

精度将是不那么精确的,最可能是粗糙的。

请参阅这个简短的节目:

代码语言:javascript
运行
复制
#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)

代码语言:javascript
运行
复制
CLOCK_MONOTONIC resolution is: 0 sec, 1 nsec
CLOCK_MONOTONIC_COARSE resolution is: 0 sec, 4000000 nsec

所以单调有纳秒的精度,粗的有4毫秒的精度。

与上面的评论不同,相反,建议在您需要的时间允许时使用粗略的版本。

对时钟的调用在用户程序中是如此频繁,以至于他们在vDSO中占有一席之地。

当您使用粗版本时,您拥有完全为零的系统调用,并且它的速度与您的机器能够运行几条指令一样快。多亏了vDSO,您的程序在调用过程中完全停留在"userland“中。与其他类型的时钟,您将有一些系统调用,并可能访问硬件。因此,至少要切换到“内核”,然后返回到"userland“。

当然,如果您的程序只需要12次调用,那么这个问题就没有任何意义了,但是如果程序严重依赖于时钟,那么它可以节省大量的时间。这就是为什么,vDSO首先存在:性能!

  • 首先定义你所需要的时间的精确性。够了,你需要毫秒,微秒,等等.
  • 记住,除非你在修理RT系统,否则时间是一个相对的价值!假设您调用了clock_gettime,并且在返回之后,您的线程立即因任何内核业务而被中断:您得到的准确性是多少?这正是2001年击败HAL的著名问题:太空奥德赛:“现在几点了?”
  • 由此你可以得到你需要的时钟的类型。
  • 您可以混合单调和粗糙版本的它,仍然计算延迟或比较(这是最初的问题)。但是,当然,精度是不那么精确的。
  • 单调最适合做时间延迟和比较,因为它们不依赖于实时(如您的手表显示)。当用户更改实际时间时,它们不会改变。
  • 相反,如果您需要显示事件发生的时间(对用户有意义),请不要使用单调!
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58189790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档