Xcode 中 Instruments(Time Profiler) 的注意事项

网上已经有很多相关 Instruments 的介绍,今天从另外的角度再罩一个轮子。主要内容来自 WWDC&Using Time Profiler in Instruments,接下来仅简单的介绍一下开发中忽略的点(即使是你看过了 WWDC, 可能也会忽略的)。
先看这张图:

00

这张图片主要介绍了 Time Profiler 的功能原理:
1、在一定时间间隔(图中显示为 1ms) Time Profiler 会检测当前的调用栈,然后以调用栈的形式记录于详细视图中(如上图的底部显示)。
2、如果执行时间比较短的,没有检测到的概率比较大(比如图中的 3,每次检测都没有)。
3、从详情视图中无法看出函数/方法的调用顺序,仅仅是一个 初略(后面会对这个 初略 做核心的解释)的统计。

说到这里、再来看另一张图:

image

尤其是看第一句 Doesn’t measure durationTime Profiler 本来就是用来检测一个函数/方法的执行效率(时间)的。这一句怎么理解????
其实在上面的第 3 点也已经提到,Time Profiler 仅仅是一个 初略 的统计。在 WWDC 视频中也有提到,并非是简单的:结束时间减去开始时间,其中也有一些优化(具体什么样的优化,没有发现)。
======================== 尴尬的分割线 ========================
上面都是纸上谈兵, 接下来开始试验: 先写如下的代码:

// touch
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 调用开始
    os_log_t osObj = os_log_create("hg-cubsystem", "hg-category");
    os_signpost_interval_begin(osObj, 6666, "hg-name");
    
    // 调用测试代码
    [self testSleep];
    
    // 调用结束
    os_signpost_interval_end(osObj, 6666, "hg-name");
}

// 测试代码
- (void)testSleep {
    for (NSInteger j=0; j<5; j++) {
        for (NSInteger i=0; i<10000; i++) {
            NSLog(@"%zd", i);
        }
    }
}

想通过 Time Profiler 来检测一下 testSleep 方法的执行效率(时间),最终的结果如下:

44

先看一下 标注 1 差不多执行了 8 秒左右,为了准确性、请看 标注 2 显示的是 8.89s(这才是实际的执行时间)。但是往往我们比较关注的 标记 3 的信息,但是明显是不对的,给出的是 3.63s
是的、我们往往关注的肯定是 标注 3 的信息,但是这个信息又是不靠谱的。在实际开发中,只能针对 标记 3 的信息进行分析,比如使用 TraceUtility 这个工具。
看到这里,那么问题来了:
Q1:怎么知道的 标注 1/2testSleep 方法的执行效率(时间)?
A1: 单凭 Instruments 是看不出来的,我主要是依赖 标注 2 的信息,标注 2 是我使用 os_signpost_interval_beginos_signpost_interval_end 在项目代码中埋的点,从上面的代码可以看到。关于这两个 api,主要是通过 Instrumentsos_signpost 进行查看的。是苹果 在 2018 年 Xcode 提供的 自定义 Instruments 的核心 api。以后有时间会介绍 Xcode 自定义 Instruments 相关的技术实现。
Q2: 通过以上的介绍,是不是 Timer Profiler 就没有用?
A2: 那肯定是有用的,在实际开发中都是使用 Timer Profiler 来检测项目中卡顿等一系列的问题还是很有帮助的。虽然是不准确的效率(时间)统计,但是在一定程度上能体现出那些执行相对较高的函数/方法。
Q3: 是怎么发现 Time Profiler 是不准确的?
A3: 刚开始的目的是想通过 Time Profiler 来做自动化性能分析的,初步设想是通过 TraceUtility 这个工具来进行 Instruments.trace 文件解析、找出感兴趣的函数/方法的执行时间。后来经过一段时间的研究以及在 WWDC 上的学习,发现这个方案是不可行的。其次也是因为近期自己在研究 Xcode 自定义 Instruments 相关的学习。

最后提醒: 虽然 Time Profiler 并非百分百准确,但是其用途是毋庸置疑的,别被当前文档产生误解。

大家好,我有一个掘金账号,在掘金的文章链接是:Xcode 中 Instruments(Time Profiler) 的注意事项, 谢谢关注!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容