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

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


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

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


尤其是看第一句 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 方法的执行效率(时间),最终的结果如下:


先看一下 标注 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 并非百分百准确,但是其用途是毋庸置疑的,别被当前文档产生误解。

转载于:https://juejin.im/post/5ce021886fb9a07eae2a2d8a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值