IOS性能优化之一些常见的性能指标
一 代码的执行效率
在编程中,一段代码的执行效率时很难被估算和预测的,其主要受如下几个方面的影响:
算法依据的数据基础
编译器产生的代码质量和语言的执行效率
问题的输入规模
硬件的执行速度
在通常情况下,问题的输入规模和算法的数学基础是开发者需要考虑的因素。“时间复杂度”是用来描述算法执行效率的一个重要的标准。
时间频度:一个算法解决问题所消耗的时间。但是一般情况下,一个算法解决问题消耗的时间通常与输入值有关。
在计算一个算法的时间复杂度时,我们可以将算法分解为逐条语句,计算每条语句的时间频度后再进行累加,如下代码的作用是对输入求累加,我们通过注释来分析代码行时间复杂度:
sum=0; (1)
for(i=1;i<=n;i++) (n+1)for(j=1;j<=n;j++) (n^2)sum++; (n^2)
解:因为Θ(2n2+n+1)=n2(Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到),所以T(n)=O(n2);
for (i=1;i<n;i++) { y=y+1; ① for (j=0;j<=(2*n);j++) x++; ② }
解: 语句1的频度是n-1,语句2的频度是(n-1)*(2n+1)=2n2-n-1。f(n)=2n2-n-1+(n-1)=2n2-2;又Θ(2n2-2)=n2,该程序的时间复杂度T(n)=O(n2)。
一般情况下,对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加1、终值判别、控制转移等成分,当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。
算法的执行时间频度和n无关时,算法的时间复杂度为O(1),这时时间复杂度最小的函数,但是需要注意,时间复杂度小并不能说明算法执行耗费的时间短,比如对于一万行代码、每行只执行一次的情况,算法的复杂度也为O(1)。下图为常见的算法时间复杂度函数:
一些常用的算法复杂度和空间复杂度
分析一个算法的复杂度时,主要有三种情况可以考虑,最差情况(Worst Case)下的,平均情况(Average Case)的, 最好情况(Best Case)下的。
(以上时间复杂度的计算示例,参考了这位同学的资料,传送门)
在实际开发中,递归函数极容易产生时间复杂度为O(n!)的代码,多层嵌套的循环结构也会大大增加算法的时间复杂度。在编写程序时,要尽量将循环层数控制在3层以内,在使用递归函数时要格外小心。
二 内存占用
内存是一个应用程序运行的基础,在运行过程中,应用程序的代码、数据、资源等要加载进内存。保证稳定合理的内存占用量是开发者需要关注的重点之一。
ARC(自动引用计数)可以帮助开发者避免最常见的内存泄漏问题,但是其也不是万能的,循环引用CoreFoundation框架对象依然需要开发者手动处理。在实际开发中内存管理需要许多的细节技巧,例如对象的懒加载、列表Cell的重用、缓存数据的清理等。
使用Xcode调试工具可以看到项目运行时内存的使用情况。
三 CPU负担与能耗
在应用程序运行过程中,CPU占用率太高除了会使设备发热、耗电量增加之外,也极易造成崩溃。在Xcode开发工具中也可以检测CPU的占用率。
相信任何用户都不会喜欢使用一个耗电量极大的应用程序,过多的后台进程、大量的计算、大量的图像处理、定时器刷新和频繁定位等都会明显的增加应用程序的耗电量,在应用程序开发中,要多注意对这些方面的管理。
在Xcode的Energy Impact中可以查看当前应用程序运行的耗电量,如下图:
在ios中,可以使用如下代码获取电池电量与状态:
[UIDevice currentDevice].batteryLevel //获取电池电量
[UIDevice currentDevice].batteryState //获取电池状态
batteryLevel将返回一个1~0之间的浮点数,表示电池电量的百分比(在真机上才有效)。
batteryState用来获取电池的状态,下面是它的枚举:
四 动画的流畅度
动画流程程度也是应用程序的一个重要的性能指标。动画的流程程度主要取决于界面的刷新帧率。所谓帧率,就是屏幕每秒钟的刷新次数,ios系统大部分机型的极限帧率是60FPS,在ios中我们可以使用CADisplayLink去获取应用运行中的刷新帧率。
在ios开发中实现动画的方式有很多,应尽量减少通过循环的方式创建动画,以提高帧率,在动画实现过程中,对CALayer层的操作和对UIImage的缩放也会增加性能的压力,这些操作也应尽量避免。
五 网络缓存
网络请求我们可以从两个方面考虑进行优化:
从请求过程中寻求优化
从请求次数上寻求优化
关于“从请求过程中寻求优化”,首先需要借助抓包工具,观察哪一个请求耗时严重,时间消耗在了发送请求阶段还是等待回执阶段,之后可以通过优化接口设计,减少传输数据量,进行高效编码等方式来进行优化。
关于“从请求次数上寻求优化”,我们可以进行请求接口的合并,通过大量使用缓存技术来优化。基础的缓存技术如webView的缓存策略、图片数据的持久化缓存、单例数据中心的应用,都可以用来十分有效的提升请求性能。
再深入一步,我们可以分析用户的行为习惯,对于某些用户离开后很快回来概率很大的页面,进行数据的短时间缓存,减少不必要的请求。
六 应用程序启动时间
应用程序启动时间是重中之重,当启动时间超过3秒,大部分用户都会明显感觉到这几秒的等待,很可能没耐心再使用下去。
七 应用程序包尺寸
应用程序尺寸是一个重要的标准,对于同样可以满足需求的两个应用程序,当用户在AppStore中进行浏览时,一般会选择尺寸较小的那一个。
要对应用程序包尺寸进行优化,开发者可以采用下面几种方式:
清除冗余的资源,比如不用的图片素材,XIB文件和冗余的类文件。
对静态资源进行打包,在ios程序中,可能会使用到大量的静态JSON文件、HTML文件或文本文件。对这些文件进行压缩,在使用时代码进行解压可以有效的减小应用程序包尺寸。
进行Bitcode优化,在Xcode7以后,Apple提供了一项新的技术来支持对应用程序进行瘦身。对于开启了Bitcode优化的应用包,Apple会进行两次优化,针对不同机型输出不同的安装包,使用户下载的包尺寸得到显著减小。
********* <<IOS性能优化实战>>*********
IOS性能优化之一些常见的性能指标相关推荐
- iOS 性能优化总结
原文链接:https://github.com/skyming/iOS-Performance-Optimization 关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化 ...
- iOS性能优化系列篇之“列表流畅度优化”工具篇
这一篇文章是iOS性能优化系列文章的的第二篇,主要内容是关于列表流畅度的优化.在具体内容的阐述过程中会结合性能优化的总体原则进行分析,所以建议大家在阅读这篇文章前先阅读一下上一篇文章:iOS性能优化系 ...
- iOS性能优化之耗电量
iOS性能优化之耗电量 前言 最近在测试App的时候,发现手机特别容易发烫,我们都知道 ,如果手机容易发烫,那么耗电量肯定会相当大,手机电量使用的时间也会相对少:对此,我在工作之余抽了点时间,对手机的 ...
- iOS进阶开发-iOS性能优化-关东升-专题视频课程
iOS进阶开发-iOS性能优化-3316人已学习 课程介绍 介绍了性能优化方法,其中包括内存优化.资源文件优化.延迟加载.持久化优化.使用可重用对象和并发访问等.这些内容都是非常重要的 ...
- Android性能优化(2):常见内存泄漏与优化(二)
文章目录 1. Android虚拟机:Dalvik和ART 1.1 JVM与Dalvik区别 1.2 Dalvik与ART区别 1.3 Dalvik/ART的启动流程 2. 常见内存分析工具 2.1 ...
- iOS性能优化 - 启动优化
APP的启动可以分为2种 冷启动(Cold Launch):从零开始启动APP: 热启动(Warm Launch):APP已经在内存中,在后台存活着,再次点击图标启动APP. APP启动时间的优化,主 ...
- iOS性能优化 - 耗电优化
耗电来源: CPU处理: 网络: 定位: 图像. 如何优化: 1. 尽可能降低CPU.GPU功耗; 2. 少用定时器: 3. 优化I/O操作: 尽量不要频繁写入小数据,最好批量一次性写入: 读写大量重 ...
- SQL性能优化技巧,常见优化10经验,数据库查询好慢,还能怎么办
我熟练应用ctrl c和ctrl v 开发curd代码好多年了. mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那 ...
- iOS性能优化实践:头条抖音如何实现OOM崩溃率下降50%+
iOS OOM 崩溃在生产环境中的归因一直是困扰业界已久的疑难问题,字节跳动旗下的头条.抖音等产品也面临同样的问题. 在字节跳动性能与稳定性保障团队的研发实践中,我们自研了一款基于内存快照技术并且可应 ...
- iOS性能优化:Instruments使用实战
最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...
最新文章
- CAS 4.0.0RC 配置MD5验证功能
- java方法区对象类型_浅谈Java内存区域与对象创建过程
- C++语言运算符重载
- makefile编译脚本
- 5G换机前夕变局:海外停滞,靠中国市场救命?
- 南开100题C语言(031-040)
- 50--出租车计费器
- Python利用fitz库提取pdf中的图片(针对多种类型pdf)
- 4.11 UIDatePicker日期时间选择器 [原创iOS开发-Xcode教程]
- 数据结构之图的基础知识(二)
- 吴恩达深度学习笔记——优化算法
- mysql计算时差_mysql-按组计算时差
- html 更改元素坐标,利用JS修改元素的位置属性,为什么style.left可行而style.top失效?...
- HiveSQL最近7/30日各品牌复购率
- 安卓原生系统开发与逆向工程
- 运行软件打不开,报“应用程序无法正常启动(0xc0150002)”的错误
- linux scons ld_run_path,使用scons替代makefile(3)
- Navicat Premium 连接mysql数据库(win10 本地安装的),报错2509 -Authentication plugin ‘ caching_sha2_。。。最新解决办法
- javaScript搜索框
- cdn加速以及前后分离SpringBoot+Vue 配置https及SSL证书