其中计时功能,time
,clock
getrusage
,clock_gettime
,gettimeofday
和timespec_get
,我想清楚地了解它们是如何实现的,为了知道在什么情况下我必须使用他们什么是他们的返回值。
首先,我们需要对返回 壁钟值的 函数与返回 进程或线程值的
函数进行分类。gettimeofday
返回壁钟值,clock_gettime
返回壁钟值 或
进程或线程值,具体取决于Clock
传递给它的参数。getrusage
并clock
返回过程值。
然后,第二个问题涉及这些功能的实现以及结果的准确性。这些功能使用哪种硬件或软件机制。
似乎getrusage
仅使用内核滴答(通常为1ms),结果比ms更准确。这样对吗?然后,该getimeofday
功能似乎使用了最准确的基础硬件。因此,其精度在最近的硬件上通常为微秒(由于API而不能更高)。关于什么的clock
,关于“逼近”该名男子页讲,这是什么意思?怎么回事clock_gettime
,API只需十亿分之一秒,是否意味着如果底层硬件允许的话,它就能如此精确?单调呢?
还有其他功能吗?
问题是在C和C
++中有几种不同的时间函数可用,其中一些在实现之间的行为也有所不同。也有很多半答案。编译时钟函数及其属性的列表将正确回答该问题。首先,让我们问一下我们要寻找的相关属性是什么。查看您的帖子,我建议:
在开始列出之前,我想指出壁钟时间很少是正确的使用时间,但是它会随着时区的变化,夏时制的变化或壁钟是由NTP同步而变化的。如果您花时间安排事件或基准性能,那么这些事情都不是一件好事。顾名思义,这真的非常有用,因为它可以挂在墙上(或台式机)上。
到目前为止,这是我在Linux和OS X中发现的时钟:
time()
从操作系统返回挂钟时间,以秒为单位。clock()
似乎返回用户和系统时间的总和。它存在于C89及更高版本中。一次应该以周期为单位的CPU时间,但是像POSIX这样的现代标准要求CLOCKS_PER_SEC为1000000,最大可能精度为1 µs。我的系统上的精度确实是1 µs。该时钟在达到顶峰时就会回绕(通常发生在〜2 ^ 32个滴答之后,对于1 MHz的时钟来说不是很长)。man clock
说自glibc 2.18起,它是clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...)
在Linux中实现的。clock_gettime(CLOCK_MONOTONIC, ...)
提供纳秒分辨率,是单调的。我相信“秒”和“纳秒”分别存储在32位计数器中。因此,经过数十年的正常运行时间后,任何折回都将发生。这看起来像一个很好的时钟,但是不幸的是,它在OS X上尚不可用。POSIX 7 描述CLOCK_MONOTONIC
为可选扩展。getrusage()
事实证明,这是我的最佳选择。它分别报告用户时间和系统时间,并且不会回绕。我的系统的精度为1 µs,但我也在Linux系统(带GCC 4.1.2的Red Hat 4.1.2-48)上进行了测试,精度仅为1 ms。gettimeofday()
以(名义上)μs精度返回壁钟时间。在我的系统上,该时钟似乎确实具有µs精度,但这不能保证,因为“系统时钟的分辨率取决于硬件”。POSIX.1-2008这样说。“应用程序应该使用该clock_gettime()
函数而不是过时的gettimeofday()
函数”,因此您应该远离它。Linux x86并将其实现为系统调用。mach_absolute_time()
是OS X上非常高分辨率(ns)时序的一个选项。在我的系统上,这的确提供了ns分辨率。原则上,该时钟回绕,但是它使用64位无符号整数存储ns,因此在实践中回绕应该不是问题。可移植性值得怀疑。除另有说明外,以上所有内容都存在于Linux和OS X中。上面的“我的系统”是一台运行Mac X且带有GCC 4.7.2的OS X
10.8.3的Apple。
最后,除了上面的链接之外,这是我发现有用的参考文献列表:
更新 :自OS clock_gettime
10.10(Sierra)起已实现。同样,基于POSIX和BSD的平台(如OS
X)都共享rusage.ru_utime
struct字段。
Comparing Clocks time_get_clock_info.py import textwrap import time available_clocks = [ ('clock', time.clock), ('monotonic', time.monotonic), ('perf_counter', time.perf_counter), ('p
我知道这是一个非常常见的问题,但我觉得我找到的答案并没有真正解决问题。我将概述我的具体用例,并对来自其他SO答案和网络的信息进行总结。 对于我正在编写的服务,数据库条目被创建并存储在移动设备和我们的网站上,需要以两种方式同步。我们目前的目标是Android和iOS,它们都使用sqlite作为关系数据库。服务器端是使用Django和MySQL在Python中实现的,但将来可能会有其他解决方案取代它。
问题内容: 我们如何衡量在Swift中运行一个函数所花费的时间?我试图以这种方式显示经过的时间:“经过的时间为.05秒”。看到在Java中,我们可以使用System.nanoTime(),Swift中有可用的等效方法来实现这一点吗? 请看一下示例程序: 问题答案: 这是我编写的用于测量Swift中的Euler问题的Swift函数 从Swift 3开始,Grand Central Dispatch现
问题内容: 有没有一种简单的方法/模块可以 正确 测量python中的经过时间?我知道我可以简单地打电话两次并取差额,但是如果更改系统时间,那将产生错误的结果。当然,这种情况很少发生,但这确实表明我在衡量错误的事情。 考虑到持续时间时,使用它来衡量是难以置信的。您将两个绝对时间测量值的差值反过来由持续时间测量值(由计时器执行)和已知的绝对时间(手动设置或通过ntp设置)构成,而您根本不感兴趣。 因