Time Profiler
简介:时间分析工具,能帮助我们分析代码的执行时间,找出导致程序变慢的原因。
下面就用三个方法来进行相关测试:
//NSLog
-(void)printLogOC{
//代码方式获取运行时间
double dateStart = CFAbsoluteTimeGetCurrent();
for (int i = 0; i<10000; i++) {
NSLog(@"---->NSLOG:%d",i);
}
double dateEnd = CFAbsoluteTimeGetCurrent()-dateStart;
NSLog(@"NSLog timeConsuming = %f",dateEnd);
}
//printf
-(void)printLogC{
for (int i = 0; i<10000; i++) {
printf("====>printf:%d",i);
}
}
//子线程中forLoop
-(void)forLoop{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i<10000; i++) {
NSLog(@"****>%d",i);
}
});
}
一、打开Instruments 再打开Time Profiler
启动Xcode -> Instruments
这个就是Time Profiler的面板
二、选择project ,点击开始运行按钮
运行完需优化的代码后,点击暂停。
运行完成后的结果展示:
三、工具栏设置,方便快速定位问题
工具栏的显示设置
- Separate by State : 线程分离,状态分开显示 ,例如:Running状态,
- Separate by Thread : 线程分离, 每个线程分开显示,只有这样 才能在调用路径中能够清晰看到占用CPU耗时最大的线程.
- Invert Call Tree : 从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时,比如FunA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面.
- Hide System Libraries : 隐藏系统调用,只关注自己代码的耗时
- Flatten Recursion : 递归函数, 每个堆栈跟踪一个条目
- Top Functions : 显示某个函数的总时间,A函数内调用多个函数时,可以显示A函数的总耗时
四、查看详情,
设置完后,界面就不会再有那么多系统调用了,能清晰的定位到想关调用。
可以双击定位到代码。
五、定位相关问题代码
好了,到这里就能发现一些问题了,再针对问题去优化。
开发中遇见过的问题:
在做通讯录的时候,要按姓排序分组,然后在通讯录展示的时候一直会卡,发现iOS默认方法取名字的首字母太耗时了。
//取大写字母
-(NSString *)firstCharactor:(NSString *)aString{
NSMutableString *str = [NSMutableString stringWithString:aString];
//先转换为带声调的拼音
CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformMandarinLatin, NO);
//再转换为不带声调的拼音
CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformStripDiacritics, NO);
//转化为大写拼音
NSString *resultStr = [str capitalizedString];
//获取并返回首字母
return [resultStr substringToIndex:1];
}
优化方案:
添加pinyin.c,pinyin.m文件到项目中,利用里面的函数,瞬间感觉起飞
点击下载文件