美文网首页
iOS和Mac开发 如何挖掘项目做性能优化点

iOS和Mac开发 如何挖掘项目做性能优化点

作者: 只懂搬砖的z_bl | 来源:发表于2020-09-25 17:37 被阅读0次

特别鸣谢老大lunzi哥的分享。短短几分钟,感觉学到了很多!
这只是一篇方法论或者是个引子,性能优化具体操作,请参考另外一篇文章
各种性能优化方案

前言

项目代码在随着业务需求的不断迭代和数据量不断增加时,原有代码的逻辑处理方式在性能方面可能就跟不上要求了。要不就是处理时间过长,要不就是某些异常情况没有考虑,导致了一系列奇怪的问题。

性能优化,就是为了解决上述问题而想到的一个方案。我们可以分析性能可能发生异常的情况和借助一些工具,从而制定出对应的优化策略,让程序得以优化

性能瓶颈分类

具体的内容直接写出:

I/O开销

  • 网络I/O
  • 文件I/O
  • 内存I/O

计算

计算又可以分为

绘制/渲染

排版

具体细说

I/O相关

  • 网络

    这一方面,其实在客户端可做的不多,因为,我们如果正常的发送一个请求,更多的耗时操作或者瓶颈出现在server端,高并发,多线程,多表格查询,都有可能导致server响应速度增加。

    所以在通常情况下,网络我们暂时不去考虑(因为需要考虑性价比和提升结果,一切以结果为出发点)

  • 文件 和 内存

    • 内存

      在计算机中,我们默认内存的操作速度是很快的,虽然其可缓存的数据相对文件操作来说相当少,但也不影响其操作速度的快慢,所以,我们正常去操作内存IO,也不会太过影响性能

    • 文件

      在IO这部分,最大头的就是文件IO了。文件的读写,保存或者查找,都是IO操作里最花费时间。所以如果想要优化IO,从文件IO操作着手效益最高

      相关的例子说明:

      • 二进制重排
      • 多个framework的合并
      • 减少项目中文件数量

      都能提高相关的内容

计算

绘制/渲染

  • 缓存复用
  • 视图层级

最典型例子UITableView的tableviewcell缓存机制,其初衷就是为了防止过多的cell视图被创建,创建没有什么,就是分配一个内存地址,但是view上的内容绘制、渲染,在从创建到获得view对象之间,占比相对较大。

还有一个不太恰当的例子:离屏渲染。圆角触发离屏渲染终究还是因为layer层太多视图层级,导致需要一层层解析处理渲染,再统一合并渲染处理。

排版

解决方案:预排版

缓存cell高度就是最好的例子

最典型例子还是在UITableView的UITableViewDelegate方法heightForRowAtIndexPath。此方法在创建并滑动的时候,会被多次调用。如果,cell的高度每次都要通过计算获得,那将大大降低滑动效率。这也是为什么UITableView会增加一个预估高度的属性,虽然有时候觉得很鸡肋,且会影响页面显示(跳动什么的)。但也是为了减少应要排版而引发计算的消耗。

性能的具体体验

时间

启动时间也好,方法调用时间也好,视图滚动耗时时间也好,都与时间有关。所以通过时间来判断性能的好坏,是个不错的选择。

  • 前提

    前面所说,除网络IO操作外,这个的大头决定与server,客户端没有太多能力可以处理。所以时间计算时,需要剔除网络请求带来的影响

    如滑动操作,1000条数据要滑动展示,最好先将这1000条数据内容加载并缓存,然后剔除网络的影响来测量,就能较为准确的知道计算可能导致的时延问题。

  • 工具

    时间:instruments的time profiler就是很好的工具。

    FPS:很多第三方库可以选择的。

## 其它内容?

有些什么其他的耗电啊,内存泄漏啊,有些都是在特别明显再处理(耗电)或者是代码层面(规范编写)在处理或者避免的。所以不算太大的优化点。

当然也是需要的,只是在必要时再做,考虑投入产出比即可。

方案的制定

优化的大体方向已经有了,那具体优化细节点,该如何确定呢?

大体步骤:

  1. 现状是啥?
  2. 问题点有哪些?每个问题点的可能影响占比是多少?
  3. 针对占比大的问题,分析问题所属类型,使用对应类型解决办法尝试
  4. 优化前优化后结果对比,输出优化结果。确定优化成效
  5. 总结

最后还是感谢lunzi哥的分享内容!醍醐灌顶

一些大牛的总结

落影 -- 启动时间的一些分析

相关文章

网友评论

      本文标题:iOS和Mac开发 如何挖掘项目做性能优化点

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