最近项目主要功能已经完成,所以针对项目需要做一个性能优化,以检查代码里是否有些代码写的不够优秀,是否有可优化的空间,从而使 App
用最小的性能消耗满足功能的实现;
使用工具
Xcode 14.0.1
Instruments
第一步: 打开Xcode自带的Instruments
image.png选择 CPU Profiler
工具
按上面操作,build
成功后弹出 Instruments
工具,选择CPU Profiler
选项
到这里之后,我们前期的准备工作做完啦,下面开始正式的测试!
1.选中Xcode
先把程序 (command + R)
运行起来
2.选中真机设备,选择需要检测的 app
项目;
3.点击Recoder
录制,底部工具栏有个Call Tree
的选项,点开,选中Invert Call Tree
和Hide System Libraries; (如下图所示)
Separate by Thread -> 按线程分割
Invert Call Tree -> 反转调用顺序
Hide System Libraries -> 隐藏系统库
Flatten Recursion -> 展平递归
选中 CPU Usage
这一栏,也可展开查看,每一个核心的性能损耗在哪些函数调用上;
4.依次找出CPU
占用率较高的函数调用栈,看看是否有优化的必要;(举个例子如下图所示)
这里NSDate
和NSString
的转换是是个类方法,每次都要创建NSDateFormatter
对象, 因此会产生不必要的性能损耗,所以我们可以创建一个 static
类型的NSDateFormatter
对象,从而减少某些常用对象的创建销毁, 进而减少CPU
的使用率;
5.在整个工具中,CPU
占用率最高的从上往下排,可以找到看看哪些是自己实现的代码,有优化空间,进而优化后再看整个app
,CPU
的占用率是否有下降;
原始代码
+ (NSString*)stringWtihTimeInterval:(NSTimeInterval)interval {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss SSS"];
NSDate *dateNow = [NSDate dateWithTimeIntervalSince1970:interval];
NSString *currentTimeString = [formatter stringFromDate:dateNow];
return currentTimeString;
}
修改后的代码
static NSDateFormatter *formatter;
+ (NSString *) stringWtihTimeInterval:(NSTimeInterval)interval {
if (!formatter) {
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss SSS"];
}
NSDate *dateNow = [NSDate dateWithTimeIntervalSince1970:interval];
NSString *currentTimeString = [formatter stringFromDate:dateNow];
return currentTimeString;
}
CPU Profiler
性能调优是每一个iOS高级开发都必须要掌握的技能,今天就简单记录一下,谢谢各位看官姥爷🙏;
网友评论