美文网首页
性能优化思路概括

性能优化思路概括

作者: 门前的那颗樱桃树 | 来源:发表于2020-03-14 21:57 被阅读0次

一、性能优化相关涉及到的硬件

1、CUP(中央处理器)

  对象的销毁和创建、对象属性的调整、布局计算、文本计算、文本排版、图片格式的转换和解码 和 图像的绘制等。

2、GPU(图形处理器)

  纹理的渲染;
  Mac的缓存是分为前后帧缓存,可以增加处理速度。

处理流程

卡顿的原因:
  CPU计算之后,GPU进行渲染,如果计算和渲染的时间太长,在还没有处理完上一帧,下一帧出现,就会接着显示上一帧,就出现了掉帧的情况。
解决卡顿方法:
  尽量减少CUPGUP的资源消耗,保证正常的流畅。我们屏幕显示,一般保证在一秒钟60帧,就不会产生卡顿的现象。

二、优化从哪些方面着手

CUP:

  • 尽量用轻量级的对象,比如用不到的时间处理的地方,可以考虑使用CALayer取代UIView
  • 不要频繁的调用UIVIew的相关属性,比如frameboundstransform等属性,尽量减少不必要的修改;
  • 尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性;
  • Autolayout会比直接设置frame消耗更多的CUP资源;
  • 图片的size最好刚好跟UIImageView的size保持一致;
  • 控制一下线程的最大并发数量;
  • 尽量把消耗耗时的操作放到子线程去做:
    • 文本处理(尺寸计算、绘制);
    • 图片处理(解码、绘制)。很多第三方的框架,都是这样子做的。将UIImae转为CGImage,创建一个CGContextRef,把CGImage放到这个谓图上下文中。通过CGContextDrawImage画在谓图上。最后放到UIImage里,就完成了解码和绘制。

GPU:

  • 尽量避免短时间内大量图片的显示, 尽可能将多张图片合成一张来显示;
  • GPU能处理的最大尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU的资源进行处理,所以纹理尽量不要超过这个尺寸。
  • 尽量减少视图数量和层次;
  • 减少透明的视图(alpha < 1), 不透明的就设置opaqueYES
  • 尽量避免出现离屏渲染;
    • 需要创建新的缓冲区;
    • 离屏渲染的整个过程,需要多次切换上下文环境,从当前屏幕切换到离屏,等到离屏渲染结束后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕。

哪些操作会触发离屏渲染?

  • 光栅化:layer.shouldRasterize = YES
  • 遮罩:layer.mask\
  • 圆角:同时设置layer.masksToBounds = YESlayer.cornerRadius大于0
    • 如果你要设置圆角,可以通过CoreGraphics绘制裁剪圆角,或者叫美工提供圆角图片。
  • 阴影:layer.shadowXXX
    • 如果设置了layer.shadowPath就不会产生离屏渲染。

三、卡顿检查

  • 平时我们所说的 “卡顿” 主要是因为在主线程执行了比较耗时的操作;
  • 可以添加Observe到主线程RunLoop中,通过监听RunLoop状态切换的耗时,以达到监控卡顿的目的;
    这里有一个三方的框架LXDAppFluecyMonitor大家可以尝试了解哈。

四、耗电的主要来源

  • 尽可能降低CUPGPU功耗
  • 少用定时器
  • 优化I/O操作
    • 尽量不要频繁写入小数据,最好批量一次性写入
    • 写入大量重要数据时,考虑用dispathch_io, 其提供了基本GCD的一部操作文件I/OAPI,用dispathch_io系统会优化磁盘访问;
    • 数据量比较大的,建议使用数据库(比如SQLiteCoreData
  • 网络优化
    • 减少、压缩网络数据(XML体积比较大、JSON体积比较少);
    • 如果多次请求的相同的,尽量使用缓存;
    • 使用断点续传,否则网络不稳定的时候可能会多次传输相同内容;
    • 网络不可用时,不要尝试执行网络请求;
    • 让用户可以取消长时间运行或者速度很慢的网络操作,设置合适的超时时间;(比如网络慢时,你加载数据有蒙版,用户就无法操作,一直在等待网络请求)
    • 尽量批量传输,比如:下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块的下载。如果下载广告,一次性下载一些,然后再慢慢展示。如果下载电子邮件,一次性下载多封,不要一封一封的下载;
  • 定位优化
    • 如果只是需要快速确定用户位置,最好使用CLLocationManagerrequestLocation方法。定位完成后,会自动让定位硬件断电;
    • 如果你应用不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务;
    • 尽量降低定位精度,比如:尽量不要使用精度最高的KCLLocationAccuracyBest
    • 需要后台定位时,尽量设置pausesLocationUpdatesAutomaticallyYES,如果用户不太可能移动的时候,体统会自动暂停位置更新;

五、APP的启动

大致分为3个阶段:

  • dyld:Apple的动态链接器,可以用来装载Mach-O文件(可执行文件、动态库等);
  • runtime:
  • main:

启动APP时,dyld所做的事情有:

  • 装载APP的可执行文件,同时会递归加载所有依赖的动态库;
  • 当dyld把可执行文件,动态库都装载完毕后,会通过Runtime进行下一步处理;

启动APP时,runtime所做的事情有:

  • 顶用map_images进行可执行文件内容的解析和处理;
  • load_images中调用call_load_methods,调用所有ClassCategory+load方法;
  • 进行各种objc结构的初始化(注册objc类,初始化类对象等等);
  • 调用C++静态初始化器和__attribute__((contructor))修饰的函数;
    到此为止,可执行文件和动态库中所有的符号(ClassProtocolSelectorIMP
    ...)都已经按格式成功加载到内存中,被runtime所管理。

启动APP时,main所做的事情有:

  • APP的启动由dyld主导,将可执行文件加载到内存,顺便加载所有依赖的动态库;
  • 并由runtime负责加载成objc定义的结构;
  • 所有初始化工作结束后,dyld就会调用main函数;
  • 接下来就是UIApplicationMain函数,AppDelegate的application:didFinishLaunchingWithOptions:方法。

APP的启动分为2种:

  • 冷启动:从零开始启动APP;
  • 热启动:APP已经在内存中,在后台存活着,再次点击图标启动APP;

APP启动时间优化,主要是针对冷启动进行优化。
通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments):

  • name:DYLD_PRINT_STATISTICS value:1 (主要是main函数之前的消耗时间)
  • 如果需要更详细的信息,将DYLD_PRINT_STATISTICS替换为DYLD_PRINT_STATISTICS_DETAILS

一般启动时间在400毫秒内都是能接受的。

优化dyld、runtime、main

  • dyld:
    • 减少动态库、合并一些动态库(定期清理不必要的动态库);
    • 减少ObjC类、分类的数量、减少Selector数量(定期清理不必要的类、分类);
    • 减少C++虚函数数量;
    • Swift尽量使用struct
  • runtime:
    • +initialize方法和dispathch_onec取代所有的__attrbute__((constructor))C++静态构造器ObjC的+load
  • main:
    • 在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部放在finishLaunching方法中;
    • 按需加载;

六、安装包瘦身

安装包主要包括:可执行文件、资源

  • 可执行文件:
    • 编译器优化,比如:
      • Strip Linked ProductMake Strings Read-OnlySymbols Hidden by Default设置为YES;(新项目一般默认都是YES,只有老项目可能没有)
      • 去掉异常支持,Enable C++ ExceptionsEnable Objective-C Exceptions设置为NOOther C Flags 添加-fno-exceptions ;(这个到 Build Settings 里面搜索)
    • 利用AppCode检测未使用代码:菜单栏 -> Code -> Inspect Code
    • 编写LLVM插件检测重复代码、未被使用的代码;
  • 资源:

相关文章

  • 性能优化思路概括

    一、性能优化相关涉及到的硬件 1、CUP(中央处理器)   对象的销毁和创建、对象属性的调整、布局计算、文本计算、...

  • 微服务性能优化

    目录 一、优化思路 二、优化方向 三、优化实战 (一)服务背景 (二)优化方向 一、优化思路 清楚性能基线 只有清...

  • 数据库优化

    优化思路 优化上有两个主要方面:安全与性能 安全 ---> 数据可持续性 性能 ---> 数据的高性能访问 优化维...

  • 说一说那些我也不太懂的 Python 对象优化

    我们通常做性能优化的思路是:先优化业务逻辑,再优化架构,最后再优化语言的数据结构等。所以如果想将性能优化到极致,往...

  • MYSQL优化杂谈二,Query优化

    Query 优化基本思路 优化更需要优化的Query,什么语句更需要优化? 定位优化对象的性能瓶颈; 明确的优化目...

  • 转载:史上更全的 MySQL 高性能优化实战总结!

    转载:史上更全的 MySQL 高性能优化实战总结! 1 前言 2 优化的哲学 3 优化思路 3.1 优化什么 3....

  • 并发写大文件的优化

    优化思路 1. 让磁盘IO和网络IO时间重叠 见【性能优化的秘密】Hadoop如何将TB级大文件的上传性能优化上百...

  • MySql性能优化思路

    mySQL 性能优化 1 连接 Connections 经常会遇见”mysql: error 1040: too ...

  • 性能测试优化思路

    一、确定性能指标 自行计算 根据目标项目的每日PV,然后根据特定的公式算出每秒的PV1.示例公式: 每台服务器每秒...

  • CPU 性能优化思路

    应用程序优化 编译器优化 算法优化 异步处理 多线程代替多进程 善用缓存 系统优化 cpu绑定 cpu独占 优先级...

网友评论

      本文标题:性能优化思路概括

      本文链接:https://www.haomeiwen.com/subject/qokmshtx.html