在 Linux 中测量时间-time vs 时钟 vs getruse vs 时钟 _ gettime vs gettimeofday vs timespec _ get?

在计时函数 timeclockgetrusageclock_gettimegettimeofdaytimespec_get中,我想清楚地了解它们是如何实现的,它们的返回值是什么,以便了解在什么情况下我必须使用它们。

首先,我们需要将返回 挂钟值挂钟值挂钟值的函数与返回 进程或线程值的函数进行分类。gettimeofday返回挂钟值,clock_gettime返回挂钟值 或者进程或线程值,这取决于传递给它的 Clock参数。getrusageclock返回进程值。

第二个问题是关于这些功能的实现以及它们的准确性。这些功能使用哪种硬件或软件机制。

看起来 getrusage只使用内核刻度(通常1毫秒长) ,因此不能比 ms 更精确,对吗? 然后,getimeofday函数似乎使用了最精确的底层硬件。因此,在最近的硬件上,它的精确度通常是微秒(由于 API 的缘故,不可能超过微秒)。 那么 clock呢,手册中提到的“近似”是什么意思呢? 那么 clock_gettime呢,它的 API 是纳秒级的,这是否意味着如果底层硬件允许的话,它能够如此精确呢?那么单调性呢?

还有其他功能吗?

78171 次浏览

问题是在 C 和 C + + 中有几个不同的时间函数可用,其中一些函数在不同实现之间的行为有所不同。也有很多半答案漂浮在周围。编译时钟函数列表及其属性可以正确地回答这个问题。首先,让我们问一下我们要寻找的相关属性是什么。看看你的帖子,我建议:

  • 什么时间是由时钟来衡量的? (真实的、用户的、系统的,或者,希望不是墙上的时钟?)
  • 时钟的精度是多少? (s,ms,μs,还是更快?)
  • 过了多长时间钟才会转动? 或者有什么机制可以避免这种情况?
  • 时钟是单调的,还是会随着系统时间的变化而变化(通过 NTP、时区、夏令时、用户等) ?
  • 上述内容在不同的实现之间有何不同?
  • 具体功能是否过时、不标准等?

在开始列表之前,我想指出的是,挂钟时间很少是正确的使用时间,而是随着时区的变化,夏令时的变化,或如果挂钟是由 NTP 同步。如果您正在使用时间来安排事件或基准性能,那么这些事情都不是好事。它只适用于名字所说的东西,墙上(或桌面上)的时钟。

以下是我目前为止在 Linux 和 OS X 中发现的时钟:

除非另有说明,以上所有内容都存在于 Linux 和 OS X 中。上面的“我的系统”是一个从 MacPorts 运行 OSX10.8.3和 GCC 4.7.2的苹果系统。

最后,这里列出了一些参考资料,除了上面的链接之外,我还发现了一些有用的东西:


更新 : 对于 OS X,从10.12(Sierra)开始实现 clock_gettime。此外,基于 POSIX 和 BSD 的平台(如 OS X)共享 rusage.ru_utime结构字段。

C11 timespec_get

使用例子: https://stackoverflow.com/a/36095407/895245

返回的最大可能精度为纳秒,但实际精度是实现定义的,可能更小。

它返回墙时间,而不是 CPU 使用率。

Glibc 2.21在 sysdeps/posix/timespec_get.c下实现它,并直接转发到:

clock_gettime (CLOCK_REALTIME, ts) < 0)

clock_gettimeCLOCK_REALTIME是 POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html,而 man clock_gettime说,如果您在程序运行时更改了某些系统时间设置,那么这个度量可能会有不连续性。

C + + 11超时空

既然我们在这里,让我们也覆盖他们: http://en.cppreference.com/w/cpp/chrono

GCC 5.3.0(C + + stdlib 在 GCC 源代码中) :

  • high_resolution_clock system_clock的别名
  • system_clock 转发到下列可用的第一个:
    • clock_gettime(CLOCK_REALTIME, ...)
    • gettimeofday
    • time
  • steady_clock 转发到下列可用的第一个:
    • clock_gettime(CLOCK_MONOTONIC, ...)
    • system_clock

问题: System _ 闹钟和 std: : static _ 闹钟之间的区别是什么?

CLOCK_REALTIME vs CLOCK_MONOTONIC: CLOCK _ REALTIME 与 CLOCK _ MONOTONIC 的区别? ?