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

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

Xcode 中 Instruments(Time Profiler) 的注意事项_第1张图片
00

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

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

Xcode 中 Instruments(Time Profiler) 的注意事项_第2张图片
image

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

// touch
- (void)touchesBegan:(NSSet *)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) 的注意事项, 谢谢关注!

你可能感兴趣的:(Xcode 中 Instruments(Time Profiler) 的注意事项)