app性能优化的那些事

小敏的博客 小敏的博客     2022-08-07     287

关键词:

 

来源:树下的老男孩 

链接:http://www.jianshu.com/p/5cf9ac335aec

 

iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对复杂一些,导致应用在比如touch等较低端的产品上,光从启动到进入页面就花了将近一分钟的时间,页面之间的切换没有那种很流畅的感觉,内存也居高不下,比较影响应用的用户体验,所以很有必要进行一些优化,下面记录一下我在优化的过程中的一些心得:

 

1 instruments

 

在iOS上进行性能分析的时候,首先考虑借助instruments这个利器分析出问题出在哪,不要凭空想象,不然你可能把精力花在了1%的问题上,最后发现其实啥都没优化,比如要查看程序哪些部分最耗时,可以使用Time Profiler,要查看内存是否泄漏了,可以使用Leaks等。关于instruments网上有很多资料,作为一个合格iOS开发者,熟悉这个工具还是很有必要的。

 

2 不要阻塞主线程

 

在iOS里关于UIKit的操作都是放在主线程,因此如果主线程被阻塞住了,你的UI可能无法及时响应事件,给人一种卡顿的感觉。大多数阻塞主线程的情况是在主线程做IO操作,比如文件的读写,包含数据库、图片、json文本或者log日志等,尽量将这些操作放放到子线程(如果数据库有一次有较多的操作,记得采用事务来处理,性能相差还是挺大的),或者在后台建立对应的dispatch queue来做这些操作,比如一个低级别的serial queue来负责log文件的记录等等。程序中如果你的代码逻辑是按照同步的逻辑来写的,尽量修改逻辑代码吧。。。

 

3 使用cache

 

一般为了提升用户体验,都会在应用中使用缓存,比如对于图片资源可以使用SDWebImage这个开源库,里面就实现了一个图片缓存的功能。参考SDWebImage的代码自己也可以实现缓存功能:

 

 cache简单示意图

业务层根据资源的url向resourcemanager获取对应的资源,resourcemanager首先会到memorycache这边去获取资源,memorycache可以利用NSCache实现,因为NSCache首先是线程安全的,而且在收到内存警告的时候会自己释放对应的内存;如果memorycache没有对应的资源再去disk查找,disk也没有的话再去internet获取,获取到的话会更新到memorycache和disk中,具体可以去参考一下SDWebimage的实现细节。

 

4 减少程序启动过程中的任务

 

当用户点击app的图标之后,程序应该尽可能快的进入到主页面,尽可能减少用户的等待时间,比如我们的应用程序在启动的时候会去做3d模型的渲染操作,完成之后在进入首页面展示,但其实我们可以先进入到主页面,将渲染3d的任务放到子线程去完成,缩短用户需要等待的时间。

        3d 

5 使用合适的数据结构

 

根据不同的业务场景来选择合适的数据结构,可能在数据量比较少的时候看不出什么区别,但是假如你存储的数据量比较大且数据结构比较复杂的话,这有可能会影响到你的程序性能。一般用的比较多的数据结构就是array,但我们知道它的查找复杂度是O(n),因此假如需要快速的查找某个元素,可以使用map。可以参考下 Apple Collections Programming Topics 。

 

6 内存

 

一般开发都使用的ARC,不太需要开发者去关注内存的创建和释放这块,但假如你使用的是MRC,并且跟其它语言混杂在一起(比如c++和lua)等的时候,如何确保内存正确释放就是你需要考虑的问题了。有时候一些内存泄漏instruments可能无法准确的分析出来,那么就需要自己去排查了,可以使用method swizzling方法来辅助我们排查内存泄漏的问题,确保程序的正确运行。

 

7 懒加载view

 

不要在cell里面嵌套太多的view,这会很影响滑动的流畅感,而且更多的view也需要花费更多的CPU跟内存。假如由于view太多而导致了滑动不流畅,那就不要在一次就把所有的view都创建出来,把部分view放到需要显示cell的时候再去创建。

 

8 lua优化

 

由于项目的业务是以及部分框架是用lua语言实现的,因此也顺便说一下lua这块遇到的问题。lua号称是最快的脚本语言,一般性能上不会有什么问题,如果lua代码要优化的话,网上也有很多这块优化的注意点,这次我主要说个可能影响性能的点—lua的垃圾回收。垃圾回收是一个比较耗时的操作,假如垃圾回收的操作太过于频繁势必会影响到这个程序的运行,比如在iPod在利用lua_cjson解析一份4.7M的json文件是花了3.43s的时间,后来发现跟垃圾回收这块有关。一般内存的使用量适中的话,可以不用去理他,让lua的incremental模式自己去处理,正常情况这个会工作的比较好;假如想要自己去控制gc的运行,可以设置gc的参数,这些参数可能会跟项目有一定的关系,可以自己多试验取最优值。

 

//gc 的参数设置,根据情况取最优值

collectgarbage("setpause", 150)

collectgarbage("setstepmul", 200)

 


 

以上是我在优化过程中的一些记录总结,关于iOS图形性能这块的优化可以查看这里(http://www.jianshu.com/p/2a01e5e2141f),要是有什么关于性能优化想法也可以提出来~

oo_unit2关于性能优化与测试的那些事(代码片段)

OO_Unit2关于性能优化与测试的那些事  OO的第2单元到本周也就正式完结了。尽管这个单元的主旋律是多线程,但“面向对象”的基本思想仍然是我们一切架构与优化的出发点与前提。因此笔者在设计优化策略时,也是本... 查看详情

关于android性能监控matrix那些事?你知道那些(中)?(代码片段)

昨天更新了关于Android性能监控Matrix那些事?你知道那些(上)?说的的视频也更新了:微信Matrix卡顿监控实战,函数自动埋点监控方案今天我们接着聊下文:4.Hprof文件分析5.卡顿监控6.卡顿监控源码解析7.插... 查看详情

reactjs和reactnative的那些事

...台运行的一个框架。可以创建出在移动端运行的app,但是性能可能比原声app差一 查看详情

浏览器存储那些事(代码片段)

...App甚至可以拥有和原生App媲美的功能和体验。WebApp优异的性能表现,有一部分原因要归功于浏览器存储技术的提升。cookie存储数据的功能已经很难满足开发所需,逐渐被WebStorage、IndexedDB所取代,本文将介绍这几种存储方式的差... 查看详情

关于性能测试的那些事

 之前有做过几次做性能测试,略有心得和大家分享一下 从测试需求开始,到完成测试,都需要经过很多阶段 首先是测试需求,要评估测试需求是否合理,并不是所有的性能测试需求都需要直接来安排测试,而是评估... 查看详情

优化uitableviewcell高度计算的那些事

...用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结。我们也在维护一个开源的扩展,UITableView+FDTemplateLayoutCell,让高度计算这个事情变的前所未有的简单,也受到了很多星星的支持,github链接请戳我这篇总... 查看详情

那些android上的性能优化

性能优化是一个大的范畴,如果有人问你在Android中如何做性能优化的,也许都不知道从哪开始说起。首先要明白的是,为什么我们的App需要优化,最显而易见的时刻:用户say,什么狗屎,刷这么久都没... 查看详情

todo:软件升级的那些事

...本的部分BUG,所以经历了软件升级,一般都会比原版本的性能更好,得到优化的效果,用户也能有更好的体验。最近常见的升级有1.iOS的升级2.macOS的升级3.chrome的升级但是这升级给我门带来好多麻烦,iOS的升级导致机器好点,系... 查看详情

android面试官:“你做过那些性能优化?“(代码片段)

...不过去了,下面是我自己总结的一套通用级别的Android性能优化。1、你对APP的启动有过研究吗?有做过相关的启动优化吗?程序员:之前做热修复的时候研究过Application的启动原理。项目中也做过一些启动优化。面试官:哦,你... 查看详情

缓存性能html5缓存的那些事

更多前端文章:http://lvtraveler.github.io/关于存储说到存储,你可能会想到这是服务器端的一种设置。服务器端的存储介质大体上分为4种:cache:缓存,它可以让从数据库、磁盘上输出的东西/数据放置在缓存里,从而减少数据库或是... 查看详情

关于android性能监控matrix那些事?你知道那些?(完)(代码片段)

关于Android性能监控Matrix那些事?你知道那些?(上)关于Android性能监控Matrix那些事?你知道那些(中)?视频也更新了:微信Matrix卡顿监控实战,函数自动埋点监控方案今天抽空把后面的... 查看详情

关于android性能监控matrix那些事?你知道那些(上)?(代码片段)

前两天录制了两节关于Android性能监控Matrix的视频。1.面试中问道线上性能监控怎么办,Android线上监控种种2.Matrix卡顿监控,函数自动埋点监控方案但是还没有完全录制完全。稍后出~今天先文字分析一下关于Matrix的种种文... 查看详情

2017年,开发app你需要知道的那些事

移动讲堂:如何避免App外包被坑?【5月18日北京站】如果你身处传统企业,想做个App转型移动互联网,却没有相应的人才。如果你是创业者,初期没有技术团队,想尽快上线App产品。技术外包可能是一个不错的选择! 但在选... 查看详情

磁盘i/o那些事

背景计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代。然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时SSD硬盘价格高昂,... 查看详情

和app提供接口调接口那些事

有一个文档是很有必要的:基本内容要有比如:名称,http方式,参数,返回值返回数据类型是JSON,还是XML对于返回值注意一个地方‘’[],array(),null 这在php看来都是一个类型的比如empty;然而由于android,ios所用是强类型语言所以... 查看详情

和app提供接口调接口那些事

有一个文档是很有必要的:基本内容要有比如:名称,http方式,参数,返回值返回数据类型是JSON,还是XML对于返回值注意一个地方‘’[],array(),null 这在php看来都是一个类型的比如empty;然而由于android,ios所用是强类型语言所以... 查看详情

okr之剑·实战篇04:okr执行过程优化的那些关键事

OKR执行过程不是一成不变的,团队和个人在执行中不断优化执行的具体行动,保障OKR的高效执行。作者:vivo互联网平台产品研发团队本文是《OKR之剑》系列之实战第4篇——OKR执行过程不是一成不变的,团队和个人在执行中不断... 查看详情

go语言网络库getty的那些事(代码片段)

...求来进行自身改进。只要维护团队在,Getty稳定性和性能定会越来越优秀。个人从事互联网基础架构系统研发十年余,包括我自己在内的很多朋友都是轮子党。2011年我在某大厂干活时,很多使用C语言进行开发的同事... 查看详情