(何时)CACurrentMediaTime/mach_system_time 在 iOS 上是不是环绕?

Posted

技术标签:

【中文标题】(何时)CACurrentMediaTime/mach_system_time 在 iOS 上是不是环绕?【英文标题】:(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 中有记录,并在多个 *** 答案中进行了解释(例如 https://***.com/a/17986909、https://***.com/a/30363702)。

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

【问题讨论】:

【参考方案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 中所述。

以上是关于(何时)CACurrentMediaTime/mach_system_time 在 iOS 上是不是环绕?的主要内容,如果未能解决你的问题,请参考以下文章

何时(何时不)运行 `sanitize` 方法?

何时使用类别以及何时使用子类化? [关闭]

MySQL索引的分类何时使用何时不使用何时失效?

何时使用,何时不使用 Try Catch Final

我应该何时调用 StateHasChanged 以及 Blazor 何时自动拦截某些更改?

何时使用 Storyboard 以及何时使用 XIB