os_signpost
结合TimeProfile在性能优化的数据展示中能够更加直观、方便,这里主要展示如何在项目中使用os_signpost
1.代码展示
//引入头文件
#import <os/signpost.h>
//宏定义,实际开发中,区分Debug、Release
#define SP_BEGIN_LOG(subsystem, category, name) \
os_log_t m_log_##name = os_log_create((#subsystem), (#category));\
os_signpost_id_t m_spid_##name = os_signpost_id_generate(m_log_##name);\
os_signpost_interval_begin(m_log_##name, m_spid_##name, (#name));
#define SP_END_LOG(name) \
os_signpost_interval_end(m_log_##name, m_spid_##name, (#name));
//耗时统计
- (void)viewDidAppear:(BOOL)animated {
/*
统计这段区间的执行次数,耗时,等等,更加直观
SP_BEGIN_LOG(systemname, category, name);
systemname:自定义,可以用bundleId
category:在timeprofile中统计分类时使用,相同的扼categroy在同一个分类下
name:具体统计名称
*/
SP_BEGIN_LOG(custome, gl_log, viewDidAppear);
[super viewDidAppear:animated];
[NSThread sleepForTimeInterval:2];
[self.view bringSubviewToFront:self.enterBtn];
NSLog(@"viewDidAppear");
SP_END_LOG(viewDidAppear);
os_log_t m_log = os_log_create("custome", "gl_log");\
for(int i = 0; i < 10; i++) {
os_signpost_id_t signid_1 = os_signpost_id_generate(m_log);
os_signpost_interval_begin(m_log, signid_1, "asynctest");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"打印的第%d遍",i);
os_signpost_interval_end(m_log, signid_1, "asynctest", "index%d",i);
});
}
}
2.TimeProfile调试
先上一张Demo图
image.png
- 默认TimeProfile没有展示
os_signpost
,添加1
,添加os_signpost
- 添加后在调试选项列表中就能看到
os_signpost
,点击展开,我们可以找到自定义的systemname,即自定义爹bundleId,相当于os_signpost
统计的一级分类,我们还可以看到一些系统的systemname分类,在上面的demo中我们定义为custome - 在下面的记录数据中,
gl_log
为category参数,相当于2级分类 - 这上面的代码中,具体统计的名称有
viewDidAppear
,asynctest
- 可以看到
viewDidAppear
统计的这段代码执行了一次,耗时2s,因为我睡了2s -
asynctest
这段异步代码触发了10次,并且在os_signpost_interval_end(log,id,name,...)
这个结束函数中,我们可以在name后面插入自定义的参数,这样可以帮助我们做详细分析,从上图中,我们可以看到每次的详细调用结果
- 可以看到
网友评论