1.Blank(空模板):创建一个空的模板,可以从Library库中添加其他模板;
2.Activity Monitor(活动监视器):监控进程的CPU,内存,磁盘,网络使用情况 是程序在手机运行真正占用的内存大小
3.Allocations(内存分配):跟踪过程的匿名虚拟内存和堆的对象提供类名和可选保留/释放历史;
!5.Core Animation(图形性能)这个模块显示程序显卡性能以及CPU使用情况
6.CoreData 这个模块跟踪Core Data文件系统活动
7.Counters 收集使用时间或基于事件的抽样方法的性能监控计数器(PMC)事件 ?
8.Energy Log 耗电量监控
9.File Activity 检测文件创建,移动,变化,删除等
!10.Leaks(泄漏):一般的措施内存使用情况,检查泄漏的内存,并提供了所有活动的分配和泄漏模块的类对象分配统计信息以及内存地址历史记录;
11.Metal System Trace (Metal API是apple 2014年在ios平台上推出的高效底层的3D图形API,它通过减少驱动层的API调用CPU的消耗提高渲染效率。
12.Network 用链接工具分析你的程序如何使用TCP/IP和UDP/IP链接
13.OpenGL ES Analysis 这个模块测量分析OpenGL ES活动正确性检测以及表现问题,提供解决建议
14.System Trace 系统跟踪,通过显示当前被调度线程提供综合的系统表现,显示从用户到系统的转换代码通过两个系统调用或内存操作
15.System Usage 这个模板记录关于文件读写,sockets,I/O系统活动, 输入输出
!16.Time Profiler(时间探查):执行对系统的CPU上运行的进程低负载时间为基础采样。
!17.Zombies 测量一般的内存使用,专注于检测过度释放的野指针对象,也提供对象分配统计,以及主动分配的内存地址历史
常用的:Leaks,Zombies,Core Animation
Core Animation:
通过联调真机,可以观察到运行时每秒绘制了多少帧(60帧封顶,30帧以下可以感觉到卡顿越低越需要优化)
Debug Options:调试选项
Debug Options之前的位置:
现在直接集成到了xcode中:
xcode->Debug->View Debugging->Rendering。
Color Offscreen-Rendered Yellow(离屏渲染)(黄色):
离屏渲染会先在屏幕外创建新缓冲区,离屏渲染结束后,再从离屏切到当前屏幕, 把离屏的渲染结果显示到当前屏幕上,这个上下文切换的过程是非常消耗性能的
触发离屏渲染Offscreen rendering的行为:
(1)drawRect:方法
(2)layer.shadow
(3)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
(4)layer.shouldRasterize //光栅化
(5)layer.mask
(6)layer.masksToBounds && layer.cornerRadius
Color Blended Layers (图层混合)(红色):
很多情况下,界面都是会出现多个UI控件叠加的情况,如果有透明或者半透明的控件,那么GPU会去计算这些这些layer最终的显示的颜色
解决方法:
(1)设置opaque 属性为true。
(2)给View设置一个不透明的颜色,没有特殊需要设置白色即可。
(3)如果是label,label实际渲染区域要大于label的size,最外层多了一个sublayer,如果不设置label.layer.masksToBounds = YES; label的边缘外层灰出现图层混合的红色
Color Copied Images(图片颜色格式)(蓝色):
如果GPU不支持当前图片的颜色格式,那么就会将图片交给CPU预先进行格式转化,并且这张图片标记为蓝色。那么GPU支持什么格式呢?苹果的GPU只解析32bit的颜色格式;32bit指的是图片颜色深度=RGBA=4*8
Color Non-Standard Surface Formats (不标准的表面颜色格式)(银白色):
待研究
Color Hits Green and Misses Red(光栅化):
shouldRasterize = YES开启光栅化,什么是光栅化?光栅化是将一个layer预先渲染成位图(bitmap),再加入到缓存中,成功被缓存的layer会标注为绿色,没有成功缓存的会标注为红色,正确使用光栅化可以得到一定程度的性能提升;我们在使用tableViewCell中,一般不要用光栅化,因为tableViewCell的绘制非常频繁,内容在不断的变化,如果使用了光栅化,会造成大量的离屏渲染降低性能
(1)系统给光栅化缓存分配了一个固定的大小,因此不能过度使用,如果超出了缓存也会造成离屏渲染。
(2)缓存的时间为100ms,因此如果在100ms内没有使用缓存的对象,则会从缓存中清除。
Color Misaligned Images(图片大小):
这个选项可以帮助我们查看图片大小是否正确显示。如果image size和imageView size不匹配,image会出现黄色。要尽可能的减少黄色的出现,因为image size与imageView size不匹配,会消耗资源压缩图片。
Flash Updated Regions (重绘区域)(黄色):
当重绘UI时会用黄色色区域标注起来,因此区域越小性能越好
Leaks:检查内存是否泄漏
由于Leaks是动态监测,所以我们需要手动操作APP,一边操作,一边观察Leaks的变化,当出现红色叉时,就监测到了内存泄露,点击左上角的第二个,进行暂停检测(也可继续检测).如图所示:
下面就是定位修改了,此时选中有红色柱子的Leaks,下面有个"田"字方格,点开,选中Call Tree
下面就是最关键的一步,在这个界面的右下角有若干选框,选中Invert Call Tree 和Hide System Libraries,(红圈范围内)显示如下:
选中显示的若干条中的一条,双击,会自动跳到内存泄露代码处,如图所示
在选择call tree后,可能你会发现查看不到源码从而无法定位内存泄漏的位置,只是显示16进制的数据。此时需要你在Xcode中检查是否有dSYM File生成,如下图所示选择第二项DWARF with dSYM File.
一个 app 的内存分三类:
- Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument).
- Abandoned memory: Memory still referenced by your application that has no useful purpose.
- Cached memory: Memory still referenced by your application that might be used again for better performance.
其中 Leaked memory 和 Abandoned memory 都属于应该释放而没释放的内存,都是内存泄露,而 Leaks 工具只负责检测 Leaked memory,而不管 Abandoned memory。在 MRC 时代 Leaked memory 很常见,因为很容易忘了调用 release,但在 ARC 时代更常见的内存泄露是循环引用导致的 Abandoned memory,Leaks 工具查不出这类内存泄露,应用有限。
另外Product->analyze 静态分析或者使用xcode下部的小工具
上面表示有5个内存泄漏
耗电量检测
使用Instrument的Energy Log
第一步 : 打开手机设置,点击"开发者"
第二步 : 点击Logging
第三步 : 勾选Energy,并点击startRecording
第四步 : 运行需要测试的App(确保手机消耗的是手机自身的电池),运行3 - 5分钟,再进入手机设置点击stopRecording
第五步 : 使用xcode,把手机和xcode相连,并打开Instruments中的Energy Log,点击工具栏中import Logged Data from Device
第六步 : 得到了电池损耗日志
- Energy Usage Level的值(0 -- 20),值越大表示越耗电
-
CPU Activity 表示CPU各种活动
耗电量优化
一.代码层面
1.合理使用NSDateFormatter 和 NSCalendar这种高开销对象
- 性能测试表明,NSDateFormatter的性能瓶颈是由于NSDate格式到NSString格式的转化,所以把NSDateFormatter创建单例意义不大.推荐的做法是,把最常用到的日期格式做缓存.
2.不要频繁的刷新页面,能刷新1行cell最好只刷新一行,尽量不要使用reloadData.
3.选择正确的集合
- NSArray,使用index来查找很快(插入和删除很慢)
- 字典,使用键来查找很快
- NSSets,是无序的,用键查找很快,插入/删除很快
4.少用运算获得圆角,不论view.maskToBounds还是layer.clipToBounds都会有很大的资源开销,必须要用圆角的话,不如把图片本身就做成圆角
5.懒加载,不要一次性创建所有的subview,而是需要时才创建.
6.重用
- 可以模仿UITableView和UICollectionView,不要一次性创建所有的subview,而是需要时才创建.完成了使命,把他放入到一个可重用集合中
7.图片处理
- 图片与imageView相同大小,避免多余运算
- 可以使用整副的图片,增加应用体积,但是节省CPU
- 可调大小的图片,可以省去一些不必要的空间
- CALayer,CoreGraphics,甚至OpenGL来绘制,消耗CPU
8.cache,cache,cache(缓存所有需要的)
- 服务器相应结果的缓存(图片)
- 复杂计算结果的缓存(UITableView的行高)
9.尽量少用透明或半透明,会产生额外的运算.
10.使用ARC减少内存失误,dealloc需要重写并对属性置为nil
11.避免庞大的xib,storyBoard,尽量使用纯代码开发
CPU层面
1.Timer的时间间隔不宜太短,满足需求即可
2.线程适量,不宜过多,不要阻塞主线程
3.优化算法,减少循环次数
4.定位和蓝牙按需取用,定位之后要关闭或降低定位频率