11.性能调优
性能思维模式
- 产品是为了取悦用户才存在的。卡顿、启动缓慢、按钮响应缓慢都会使APP降级。
- 用户喜欢你的应用,但不代表你就可以肆意地耗尽设备的电量。你的应用将与其他应用共存,所以应该举止得当。
- 做到极致。如果有两个方案,方案一是瞬间CPU使用率达到100%然后进入休眠,方案二是持续的保持CPU10%的使用率,你应该选择前者。找出低耗能并一直处于运行状态的活动,并清理掉他们。
Instruments
- 内存问题:Allocations
- 选定发生内存泄漏的时间段,看看是哪个对象造成的内存泄漏,生成该对象的函数。
- 从 Current Density 切换到 Allocation Density 可以更直观的观察到内存扰动
- 内存泄漏:Leaks
- 不要过度依赖leaks,它只能检查未引用内存,不会检查循环保留,也不会检测没有成功释放的内存。
Allocations和Leaks只会告诉你哪些地方分配了多少内存,和
内存泄漏无关
-
调优CPU性能,查看各个命令的执行耗时:Time Profileral
-
绘图性能:Core Animation
-
Color Blended Layers (透明图片、混合模式)
这个选项基于渲染程度对屏幕中的混合区域进行绿到红的高亮,性能越差的区域就越红(也就是多个半透明图层的叠加)。由于重绘的原因,混合对 GPU 性能会有影响,同时也是滑动或者动画帧率下降的罪魁祸首之一。 -
Color Misaligned Images (尺寸拉伸、缩放)
会使用黄色高亮那些被压缩或者拉伸以及没有正确对齐到像素边界的图片(也就是非整型坐标),这些中的大多数通常会导致图片的不正常缩放,如果把一张大图当缩略图显示,或者不正确地模糊图像。 -
Color Copied Images (图片拷贝)
有时候寄宿图片(layer.content)的生成是由 Core Animation 被强制生成一些图片,然后发送到渲染服务器,而不是简单的指向原始指针,这个选项把这些图片渲染成蓝色。复制图片对内存和 CPU 使用来说都是一项非常昂贵的操作,所以应该尽可能的避免。 -
Color Offscreen-Rendered Yellow (离屏渲染)
这里会把那些需要离屏渲染的图层高亮成黄色,这些图层很可能需要用 shadowPath 或者 shouldRasterize 来优化。离屏渲染主要是针对 UITableViewCell 的优化,让还没有显示出来的 Cell 先绘制好。
-
链接器优化
编译器有强大的优化引擎,但它一次只能看到一个编译单元(.m文件)。编译器需要对它无法看到的任何函数做最糟糕的假设。如果它可以知道程序其他位置的情况,那么它可以做更多的优化。
LTO优化:Build Setting -> Apple Clang -Code Generation -> Link-Time Optimization
会导致编译器在中间文件中包含额外信息,链接器可以通过这些信息进行更积极的优化。大型项目可能会导致链接器耗尽内存。