【问题标题】:(When) Does CACurrentMediaTime/mach_system_time wrap around on iOS?(何时)CACurrentMediaTime/mach_system_time 在 iOS 上是否环绕?
【发布时间】:2017-08-07 15:56:05
【问题描述】:

要在 iOS 上获得准确的时间测量值,应使用 mach_absolute_time()。或CACurrentMediaTime(),它基于mach_absolute_time()。这在 this Apple Q&A 中有记录,并在多个 StackOverflow 答案中进行了解释(例如 https://stackoverflow.com/a/17986909https://stackoverflow.com/a/30363702)。

mach_absolute_time() 返回的值什么时候回绕? CACurrentMediaTime() 返回的值什么时候回绕?这会在任何现实的时间跨度内发生吗? mach_absolute_time() 的返回值是 uint64 类型,但我不确定它如何映射到实际时间跨度。

【问题讨论】:

    标签: ios


    【解决方案1】:

    您引用的文档指出,mach_absolute_time 依赖于 CPU,因此我们不能说它必须经过多长时间才能结束。在模拟器上,mach_absolute_time 是纳秒,所以如果它在UInt64.max 处换行,则转换为 585 年。在我的 iPhone 7+ 上,每秒 24,000,000 mac_absolute_time,相当于 24000 年。归根结底,mach_absolute_time 捕获的理论最大时间量会因 CPU 而异,但您在任何实际应用中都不会遇到这种情况。

    对于它的价值,与您发现的各种帖子一致,CFAbsoluteTimeGetCurrent documentation 警告说:

    重复调用此函数并不能保证结果单调递增。由于与外部时间参考同步或由于用户明确更改时钟,系统时间可能会减少。

    因此,如果您想要准确的经过时间,您绝对不想使用NSDate/DateCFAbsoluteTimeGetCurrent。两者都不能确保单调递增的值。

    简而言之,当我需要这种行为时,我一般使用CACurrentMediaTime,因为它享受mach_absolute_time 的好处,但它对我来说将其转换为秒,这使得它使用起来非常简单。它和mach_absolute_time 都不会在任何现实的时间段内循环。

    【讨论】:

    • 太好了,谢谢,这对我帮助很大!我对其他几台 iDevice(iPad Mini 1、iPad Air 2、iPad Pro 第一代、iPhone 6 使用了 24000 多年)和模拟器(近 585 年)都获得了一致的值。我使用了mach_timebase_info 函数,如前面提到的Apple Q&A 中所述。
    猜你喜欢
    • 2011-07-14
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2013-12-24
    • 2012-02-21
    相关资源
    最近更新 更多