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

时间:2017-08-07 15:56:05

标签: ios

要在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类型,但我不确定这是如何映射到实际时间范围的。

1 个答案:

答案 0 :(得分:1)

您引用的文档指出mach_absolute_time与CPU有关,因此我们无法说明在它包装之前必须经过多长时间。在模拟器上,mach_absolute_time是纳秒,所以如果它在UInt64.max处包裹,则转换为585年。在我的iPhone 7+上,每秒24,000,000 mac_absolute_time,相当于24,000年。最重要的是,mach_absolute_time捕获的理论最大时间量因CPU而异,但在任何实际应用中都不会遇到这种情况。

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

  

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

因此,如果您想要准确的经过时间,那么您绝对不想使用NSDate / DateCFAbsoluteTimeGetCurrent。既不能确保单调增加值。

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