iOS 探讨之 mach_absolute_time

阐述

去年在与大厂的交手中,碰到了如何测量函数耗时这类的问题。最近正好有点空余时间供我研究并整理它们,希望这次整理出的东西能给大家带来一点帮助。

探讨

测量函数耗时所用的方法有很多种,这次我们先来介绍 mach_absolute_time() 相关。

什么是Mach?

Mach是一个用于支持操作系统研究的操作系统内核,后来被开发成UNIX中BSD的替代内核。

Mach名称野史:  (引自百度百科)

据Tevanian说,MACH,源于一个读音错误。当时他正和其他人在匹兹堡一个下雨天里一边躲避着路上的泥水坑,一边讨论着新内核的事,Tevanian开玩笑地建议他们的新微核命名为MUCK,意为“多用户通信内核”(Multi-User Communication Kernel)或“多通用通讯核心”(Multiprocessor Universal Communication Kernel)。而一个意大利同事错将MUCK发错音为MACH后,拉希德觉的不错并采用了MACH。

两个问题

Number 1 如何获取当前系统的Mach绝对时刻

mach_absolute_time()

返回一个基于系统启动后的时钟嘀嗒数,是一个CPU/总线依赖函数。在macOS上可以确保它的行为,并且它包含系统时钟所拥有的全部时间区域,精度达到纳秒级。

(注: 时钟嘀嗒数在每次手机重启后,都会重新开始计数,而且iPhone锁屏进入休眠之后,tick也会暂停计数)

Number 2 如何将嘀嗒数转换为有意义数字 (正常时间)

mach_timebase_info()

函数用于获取当前系统时钟嘀嗒数转换信息。(主要是获取当前设备的转换分子和分母)

mach_timebase_info_data_t  转换信息

系统时钟嘀嗒数转换信息的关系如下:

时间(ns) / 系统嘀嗒数 = 转换系数分子(.numer) / 转换系数分母(.denom)

故:

时间(ns)  = 系统嘀嗒数 * 转换系数分子(.numer) / 转换系数分母(.denom)

mach_absolute_time 延伸

1 CACurrentMediaTime() 函数

CACurrentMediaTime()函数底层是mach_absolute_time(), 只是最后将结果转换为秒 

2 mach_continuous_time() 函数

我们知道mach_absolute_time()在系统锁屏的时候是处于暂停状态,如果我们想统计包含锁屏时间,那么该如何处理呢?

答案是 iOS 10 以后,官方为我们提供的mach_continuous_time()函数,供我们使用。

引用:

https://www.cnblogs.com/zpsoe/p/6994811.html

https://baike.baidu.com/item/MACH/216388#2

https://blog.csdn.net/bravegogo/article/details/53188339

http://www.cocoachina.com/ios/20161216/18361.html

猜你喜欢

转载自blog.csdn.net/yanglei3kyou/article/details/86679177
今日推荐