关于os_signpost使用

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后面插入自定义的参数,这样可以帮助我们做详细分析,从上图中,我们可以看到每次的详细调用结果