IOS性能提高

总则

 1,管理好内存。
 2,利用好多线程,能不放在主线程就不放在主线程。
 3,cache,cache,cache
 4,流程优化

IOS内存管理原理

alloc、init你弄懂50%了吗?http://www.cocoachina.com/ios/20160627/16823.html
(1)core foundation对象:需要手动处理下http://blog.csdn.net/yiyaaixuexi/article/details/8553659
(2)objective对象:a,非ARC
b,ARC:
(3)内存告警时候,以及销毁时候(调用 -(void)dealloc)方法:注意释放资源(一些uiview,以及delegate)
(4)copy和mutablecopy的区别:
1.如果receiver是不可变容器
1)copy:返回receiver,并且receiver的引用计数加1,等效于retain
2)mutableCopy:由receiver中的数据构造一个新的可变实例
2.如果receiver是可变容器
1)copy:由receiver中的数据构造一个新的不可变实例
2)mutableCopy:由receiver中的数据构造一个新的可变实例

正确使用Block避免Cycle Retain和Crash:http://tanqisen.github.io/blog/2013/04/19/gcd-block-cycle-retain/
NSTimer,当UIviewcontroller中存在NSTimer时,NsTimer强引用UIviewcontroller,所以在-(void)dealloc()方法中,失效NSTimer是不起作用的。因为根本就无法执行dealloc(),他们相互引用了。http://stackoverflow.com/questions/14490178/how-to-know-when-to-invalidate-an-nstimer http://devm.cn/2015/07/20/timer-retain-cycle.html

AutoRealeasePool原理(双向链表,push/pop操作加入或者释放autorelease对象,在runloop空闲时候,释放autorelease类型数据,所以只有在主线程中的autorelease类型数据可以被释放。 Autorelease Pool 的实现原理:http://www.cocoachina.com/ios/20150610/12093.html。而在非主线程,因为默认没有runloop,所以autorelease类型数据是无法得到释放的,所以最好使用@autoreleasepool{})
@autoreleasepool{}(


//产生一个autoreleasepoop对象
// 大量的临时变量

... ...

构造时候产生pool,析构时候pop操作,释放autorelease类型数据,在产生大量临时数据时候,最好使用它)。

NSRunloop

NSrunloop:原理,一种消息处理机制。和线程一一绑定。主线程默认存在,其他线程默认不存在。主线程对应的runloop负责主线程中的block,定时器,UI的刷新等操作。
NSRunloop深入理解:http://blog.ibireme.com/2015/05/18/runloop/
如何使一个非主线程一直运行:获取该线程runloop,并加事件源(参考AFnetwoking2)
注意当tableview滑动的时候,runloop的mode会切换。

(UIKit)界面优化:

关键词:离屏渲染(offscreen rendering),图层颜色混合(Color Blended Layers),合成。
IOS图形优化:http://www.cocoachina.com/ios/20150429/11712.html
什么是offscreen rendering?
offscreen rendring指的是在图像在绘制到当前屏幕前,需要先进行一次渲染,之后才绘制到当前屏幕。
那么为什么offscreen渲染会耗费大量资源呢?
原因是显卡需要另外alloc一块内存来进行渲染,渲染完毕后在绘制到当前屏幕,而且对于显卡来说,onscreen到offscreen的上下文环境切换是非常昂贵的(涉及到OpenGL的pipelines和barrier等),

UIKit性能调优实战讲解:http://www.jianshu.com/p/619cf14640f3
http://www.hrchen.com/2013/05/performance-with-instruments/
https://github.com/AttackOnDobby/iOS-Core-Animation-Advanced-Techniques/blob/master/12-性能调优/性能调优.md

绘制像素到屏幕上:http://www.objccn.io/issue-3-1/
解决常见的masksToBounds离屏渲染带来的性能损耗(绘制圆角):http://www.tuicool.com/articles/VNVru2N
以下操作引起离屏渲染:
Any layer with a mask (layer.mask)
Any layer with layer.masksToBounds / view.clipsToBounds being true
Any layer with layer.allowsGroupOpacity set to YES and layer.opacity is less than 1.0
Any layer with a drop shadow (layer.shadow*).
Any layer with layer.shouldRasterize being true
Any layer with layer.cornerRadius, layer.edgeAntialiasingMask, layer.allowsEdgeAntialiasing
Text (any kind, including UILabel, CATextLayer, Core Text, etc).
Most of the drawing you do with CGContext in drawRect:. Even an empty implementation will be rendered offscreen.

tip: (1)尽量将视图背景色和superView的背景色一致/背景色不要为clearColor(会引起图层混合)。
(2)避免离屏渲染。将图层的alpha设为1(如何其不为1,图层合成过程中,将引起大量的计算)。uiview的圆角,遮罩
(3)减少不必要的drawrect()操作。
(4) 处理好UIView 与 CALayer的关系。uiview层次不要太多。因为这样会加多合成。
(5)将线程安全的操作挪到非主线程。比如绘制图片等。

卡顿原因:
GPU垂直同步信号(VSync,硬件产生的),固定1/60S发出一次。在此时间间隔内,CPU,GPU需要准备好数据。在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。即PFS降低
1,CPU做的工作:对象的创建;调整;layout;布局的计算;文本的计算,渲染;图片的渲染,解码,渲染等
2,GPU做的工作:纹理的渲染,图形混合,图形生成。(离屏渲染发生在GPU中)
离屏渲染:解决常见的masksToBounds离屏渲染带来的性能损耗
http://www.tuicool.com/articles/VNVru2N
所以优化的对象(1)不能让cpu做太多的事情。
a,减少runloop执行的时间。
b,不需要在主线程操作的事情都放在其他线程。
c,缓存,缓存,缓存。
(2)不能让GPU做太多的事情。避免离屏渲染,颜色混合。

IOS大而全知识:http://www.jianshu.com/p/3141ff9c1cdc

iOS 保持界面流畅的技巧(非常好):http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/
标哥的技术博客:http://www.henishuo.com/category/performance/ :集中于UIKIt优化(包括离屏渲染等)

使用正确的API:
(1)画图
(2)集合操作(nsdictionary/nsset/nsarray的优缺点),检索/插入/查找效率。
(3)加载图片的方式( imagedNamed初始化/imageWithContentsOfFile初始化)前者会缓存,后者不缓存。
尽量不要在viewWillAppear费时的操作,viewWillAppear在 view 显示之前被调用,出于效率考虑,在这个方法中不要处理复杂费时的事情;只应该在这个方法设置 view 的显示属性之类的简单事情


图片优化专题
Facebook iOS 应用是如何加速图片显示的?:http://www.jianshu.com/p/424baa4acbc0
fastImageCache:图片显示极限优化 http://www.tuicool.com/articles/2EvuyqA

多线程

(1)设计线程安全的类(注意用好dispatch_barrier_XX)
(2)避免非主线程操作UIkit框架
https://gist.github.com/steipete/5664345
http://objccn.io/issue-2-4/
(3)GCD/ NSoperation和NSoperationQueue(构建在GCD之上)在UITableView中的应用: https://www.raywenderlich.com/76341/use-nsoperation-nsoperationqueue-swift
http://www.tairan.com/archives/2233/
(4)GCD深入理解:https://github.com/nixzhu/dev-blog/blob/master/2014-05-14-grand-central-dispatch-in-depth-part-2.md
(5)GCD同步操作会引起死锁。(在本线程里,GCD同步操作本线程,原因->GCD同步操作阻塞了该线程,而GCD又要在该线程执行代码,遗憾的是该线程被阻塞了,线程被阻塞了,GCD代码又无法执行了)

监测工具

(1)Instrument工具
a,Time Profiler获取到整个应用程序运行消耗时间分布和百分比.
b, Allocations:内存的分布
c, leaks:内存泄漏
d, Core Animation 检查图形界面/PFS。
使用instrument优化APP:http://www.hrchen.com/2013/05/performance-with-instruments/ ->概括性介绍
Instrments使用:http://www.cocoachina.com/industry/20140114/7696.html
(2)离屏渲染监测,模拟器debug菜单栏下面。
(3)第三方检测:
a, 微信读书卡顿监控系统
原理,计算NSRunloop中相关操作执行的时间,KVC观察NSRunloop状态 http://www.tuicool.com/articles/Mvq2yen
微信卡顿监控: http://www.360doc.com/content/15/1104/16/28748685_510721166.shtml
iOS实时卡顿监控
b,内存泄漏MLeaksFinder :MLeaksFinder原理介绍:http://wereadteam.github.io/2016/02/22/MLeaksFinder/因为leaks只能检测Leaked memory,而不能监测Abandoned memory
c,PFS监测KMCGeigerCounter:原理通过内置的 CADisplayLink 检测PFS。

计算耗时:

#import <mach/mach_time.h>
uint64_t start = mach_absolute_time ();    //开始时间
uint64_t end = mach_absolute_time ();     //结束时间
mach_timebase_info_data_t info;
uint64_t nanosecs = (end - start) * info.numer / info.denom;
uint64_t millisecs = nanosecs / NSEC_PER_SEC;
NSLog(@">>>>>>>>>>cost time = %llu ms", millisecs);

NSDateFormatter对象本身初始化很慢,同样还有NSCalendar也是如此.设置NSDateFormatter属性也非常慢,所以最好复用和延时生成它们。

缓存:

几种第三方缓存库比较:http://blog.ibireme.com/2015/10/26/yycache/
缓存NSURLCACHE:http://nshipster.cn/nsurlcache/

其他:

(1)runtime:利用runtime加属性,改方法,加方法等
(2)算法的改进:算一下时间复杂度/空间复杂度。

有名公司APP优化

(1)淘宝:http://www.wtoutiao.com/p/f34DOD.html
http://velocity.oreilly.com.cn/2015/ppts/liming.pdf(pdf文档)
阿里无线11.11:手机淘宝 521 性能优化项目揭秘:http://www.infoq.com/cn/articles/mobile-taobao-521-performance-optimization-project
可参考的地方: 计算每个方法耗时的时间!

Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目价格
Computer$1600
Phone$12
Pipe$1

可以使用冒号来定义对齐方式:

项目价格数量
Computer1600 元5
Phone12 元12
Pipe1 元234

定义列表

Markdown Extra 定义列表语法: 项目1 项目2
定义 A
定义 B
项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为: Γ(n)=(n1)!n
  • 块级公式:

x=b±b24ac2a

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.0 张三 张三 李四 李四 嘿,小四儿, 写博客了没? 李四愣了一下,说: 忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.0 开始 我的操作 确认? 结束 yes no


  1. 这里是 脚注内容.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值