CLOCK_MONOTONIC似乎不可用,所以clock_gettime已经出局了。
我在一些地方读到 mach_absolute_time() 可能是正确的方法,但在读到它是一个“cpu 相关值”后,它立即让我想知道它是否在下面使用 rtdsc。因此,即使该值是单调的,也会随着时间的推移而漂移。此外,线程亲和性问题可能会导致调用该函数时产生有意义的不同结果(使其在所有核心上不单调)。
当然,这只是猜测。有谁知道 mach_absolute_time 实际上是如何工作的?我实际上正在寻找 Clock_gettime(CLOCK_MONOTONIC... 或类似 OSX 的替代品。无论时钟源是什么,我期望至少是毫秒精度和毫秒精度。
我只是想了解哪些时钟可用,哪些时钟是单调的,是否某些时钟漂移,存在线程关联问题,并非所有 Mac 硬件都支持,或者需要“超高”数量的 CPU 周期来执行。
以下是我能够找到的有关该主题的链接(有些链接已经是死链接,在 archive.org 上找不到):
https://developer.apple.com/library/mac/#qa/qa1398/_index.html https://developer.apple.com/library/mac/#qa/qa1398/_index.htmlhttp://www.wand.net.nz/~smr26/wordpress/2009/01/19/monotonic-time-in-mac-os-x/http://www.meandmark.com/timing.pdf http://www.meandmark.com/timing.pdf
谢谢!
布雷特
Mach 内核提供对系统时钟的访问,其中至少一个(SYSTEM_CLOCK
) is 由文档发布 https://opensource.apple.com/source/xnu/xnu-2422.1.72/osfmk/mach/clock_types.h作为单调递增。
#include <mach/clock.h>
#include <mach/mach.h>
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
mach_timespec_t
具有纳秒级精度。不过,我不确定准确性。
Mac OS X 支持三种时钟:
-
SYSTEM_CLOCK
返回自启动以来的时间;
-
CALENDAR_CLOCK
返回自 1970-01-01 以来的 UTC 时间;
-
REALTIME_CLOCK
已弃用,与以下相同SYSTEM_CLOCK
在目前的实施中。
The 的文档clock_get_time https://opensource.apple.com/source/xnu/xnu-2422.1.72/osfmk/man/clock_get_time.html表示时钟单调递增,除非有人调用clock_set_time
。致电clock_set_time
are 灰心 https://opensource.apple.com/source/xnu/xnu-2422.1.72/osfmk/man/clock_set_time.html因为它可以打破时钟的单调性,事实上,当前的实现返回KERN_FAILURE https://opensource.apple.com/source/xnu/xnu-2422.1.72/osfmk/kern/clock_oldops.c不做任何事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)