IOS性能测试

**前言**

以下内容有可能我理解错误或者不清楚的欢迎指出,批评 谢谢!

 **iOS性能测试是什么?**

iOS性能测试是指基于iOS平台从:

资源消耗

内存泄露

流量消耗

耗电功率

渲染效果

加载时间 

crash收集

等等.....

这些方面配合一些对应场景去收集数据然后根据数据去分析和定位可能存在的问题!

**为什么做这个性能测试?**

其实在现在很多企业的功能测试和后台API的测试已经相对较为**尤其是功能测试。

但是即使是这样,尽管你的应用有多牛B,你的后台架构有多好,你别忘了你最终还是基于平台来跑,

所以你的应用在平台里面的运行效果不好(Crach率高达百分之几十,内存泄露遍布整个流程)的话,其他的也都是多余的........

**做完有什么用?**

这个问题我只能说,只要自己用心去一项项去做!研究透!你会发现很多的问题!

比如你设计几个场景然后把这几个场景一个个单独跑一遍,把数据拿出来分析一下,你会发现资源占用较高或者内存泄露严重的步骤一步一步去检查代码会发现确实有问题存在,有可能是垃圾对象冗余,也可能是接口数据太大,json解析消耗较高或者其他等等.....

**怎么去做?**

Instruments 里面集成的很不错了!所以这里用Instruments 里面的工具来做的!

一项一项来:

**1,资源消耗(Cpu、内存):**

可以直接用Xcode真机Debug

![](/photo/2015/591e566fa9bc1361cf9b6bc01e85072c.jpg)

上图大家都知道怎么看吧,比较简单。也可以用(Activity Monitor)不过没有上面这个方法简单粗暴

**2,内存泄露Leaks:**

![](/photo/2015/7911c956c385bd76509b62e826a875f2.jpg)

选中内存泄露红色区域后下面的列表会把泄露的所以相关内容在下面列表展示,你可以直接找到比例最高的方法直接定位到代码里面!

实例:

![](/photo/2015/5896badb9617811d570867752d8b257b.png)

关于:tableView:didSelectRowAtIndexPath ,分析下它的内存过程:

sushiString变量通过autorelease创建,它的引用计数是1.   

这行代码使得引用计数增加到2, _lastSushiSelected = [sushiString retain];

这个方法结束时,sushiString的autorelease生效了,这个变量的引用计数减少为1

当再次执行tableView:didSelectRowAtIndexPath这个方法时,_lastSushiSelected被赋值了新指针,老的_lastSushiSelected的引用计数还是1,没有被释放,所以产生了内存泄露。

**3,启动耗时**

两种方法:一种使用NSLog,另外一种使用Time Profiler。

使用NSLog

```shell

    CFAbsoluteTime StartTime;

    int main(int argc, char **argv) {

     StartTime = CFAbsoluteTimeGetCurrent();

     // ...

       }

- (void)applicationDidFinishLaunching:(UIApplication *)app {

     dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"Launched in %f sec", CFAbsoluteTimeGetCurrent() - StartTime);

     });

     // ...

 }

```

使用Time Profiler

Instruments->Time Profiler

Profile你的app

切换到CPU strategy view,找到你的app启动的第一帧

搜索-[UIApplication _reportAppLaunchFinished]

找到包含-[UIApplication _reportAppLaunchFinished]的最后一帧,即可计算出启动时间

![](/photo/2015/08881d7cdf950fcf380fefa4c30dbbe3.jpg)

你也可以粗略看下把有波动的部分选上会有一个时间出来!

**3,流量(Network):**

![](/photo/2015/42f1f87e33e82d779e1cd1068672ff61.jpg)

**4,加载时间(Time Profiler):**

当我们发现App有点卡的时候,可以通过Time Profiler来看耗时在哪里。

![](/photo/2015/1f96a49f1934cf4cb7c3b453f3d68486.jpg)

右边的 call Tree  一定要记得选上!下面是这些选项代表的意义!

Separate By Thread:线程分离,只有这样才能在调用路径中能够清晰看到占用CPU最大的线程.

Invert Call Tree:从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时,比如FuncA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面. 

Hide Missing Symbols:如果dSYM无法找到你的APP或者调用系统框架的话,那么表中将看到调用方法名只能看到16进制的数值,勾选这个选项则可以隐藏这些符号,便于简化分析数据.

Hide System Libraries:这个就更有用了,勾选后耗时调用路径只会显示app耗时的代码,性能分析普遍我们都比较关系自己代码的耗时而不是系统的.基本是必选项.注意有些代码耗时也会纳入系统层级,可以进行勾选前后前后对执行路径进行比对会非常有用.

**5,电量消耗(EnergyDiagnostics)**

这个主要是看那个Cpu Activity吧,我也在待研究状态,我怀疑这个工具并不是很准!

![](/photo/2015/cb91bf53465779d4ff259d3795c88773.jpg)

上面这些都是浅浅的跟大家说了一下怎么拿到一些数据!

拿到数据之后把他们收集起来分析一下,你会发现有一些场景或操作的系统资源异常,这个时候你可以抱着怀疑的态度去看看代码,也可以跟开发一起去过一下这场景相关的代码,看看是哪里导致这个消耗较大!数据接口量太大?json解析导致?对象没有释放?....

时间: 2025-01-21 12:48:39

IOS性能测试的相关文章

看沃尔玛如何玩转 React Native

本文讲的是看沃尔玛如何玩转 React Native, 在沃尔玛,顾客总是第一位的,所以我们一直在寻找方法去改善我们给客户提供的购物体验.目前沃尔玛 app 有许多嵌入式的 Web 网页,我们发现这样的实现低于我们和我们的客户对这个应用程序的要求.即使在高端机上,这种混合 Web 视图实现的性能也不是很好,并且缺少了原生应用的感觉.不止如此,通过 Web 来访问非常依赖网络(我们使用服务器端呈现 Web),网络不好的用户会有不好的体验.因此,我们在思考:"有没有一种方法,能让我们修改或者替换现在

iOS单元测试1

iOS单元测试1 iOS单元测试分为两种类型的测试: 应用测试.应用程序测试可以检查app的代码组件,比如计算机的算术运算的例子.你可以利用应用程序测试来确保你的UI空间控件保持原有位置,并且你的控件和控制器对象能够和对象模型正确地工作. 逻辑测试(库测试).逻辑测试可以检查独立代码的行为是否正确.利用逻辑测试,你可以将整个库的组件放在一起进行测试,通常测试对象是对象和方法. 性能测试:所谓性能测试,主要是评估一段代码运行的时间.(自己添加的,个人觉得应该也属于一类测试把).性能测试的格式:-

iOS面试题总结 二

1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答:Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系. 2. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import"&qu

见过的最全的iOS面试题

之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系

iOS技术周报-第26期

iOS技术周报第26期 访问iOS wiki(www.ios-wiki.com)获得更多内容. 欢迎大家投递关于iOS的新闻.技术.代码等文章,@吴发伟Ted即可. 关注微信公众账号:iOS技术分享 或者微博@吴发伟Ted获得最新的iOS技术动态. 本期主要包含: 资讯 苹果设备被曝存在后门 该后门可被攻击者利用,泄漏用户个人隐私信息.解决方法是:1)设置更复杂的秘密.2)安装Apple Configurator,然后删掉所有pairing record. 发现该后门的人是<Hacking an

《iOS开发指南》第二版 iOS7版-源码-样章-目录,感谢大家一直以来的支持

<iOS开发指南-从0基础到AppStore上线>第二版 iOS7版正式出版了 感谢大家一直以来的支持! 改版后采用全新的ios 7 api,详细介绍了最新的ios 7 开发相关的知识点,全部案例以iOS7版本SDK重新编译. 新增:iOS 7中文字排版和渲染引擎--Text Kit:      iOS6升级到iOS7遇到的问题与解决方法:      着重讲解iOS分层架构设计: 更新无处不在,更多新增内容请详细阅读本书 京东销售地址:http://item.jd.com/11419483.h

iOS单元测试和UI测试全面解析

编写测试可不是一项迷人的工作;然而,由于测试可以避免使你的宝贝应用程序变成一块充斥错误的大垃圾场,所以编写测试又是一项非常有必要做的工作.如果你正在阅读本文,那么你应当已经知道你应该为您的代码和用户界面编写测试,只是不确定如何在Xcode中编写测试. 也许你已经开发出一个能够工作的应用程序,只是还没有对它进行测试;另一方面,当您扩展该应用程序时,你又想对其任何的更改进行测试.也许你已经写了一些测试,但尚不能确定它们是否是正确的测试.或者,你现在正在开发您的应用程序,并且想随着工作的进展对之进行测

起底多线程同步锁(iOS)

iOS/MacOS为多线程.共享内存(变量)提供了多种的同步解决方案(即同步锁),对于这些方案的比较,大都讨论了锁的用法以及锁操作的开销,然后就开销表现排个序.小哥以为,最优方案的选用还是看应用场景,高频接口PK低频接口.有限冲突PK激烈竞争.代码片段耗时的长短,以上都是正确选用的重要依据,不同方案在其适用范围表现各有不同.这些方案当中,除了熟悉的iOS/MacOS系统自有的同步锁,另外还有两个自研的读写锁,还有应用开发中常见的set/get访问接口的原子操作属性. 1.@synchronize

《iOS应用开发》——1.2节启程

1.2 启程 iOS应用开发 无论你去问哪个工匠,他都会说:如果要成功,就必须要有适合工作的工具.对于iOS开发来说,你必须有一台运行OS X 10.7或者更高版本系统的苹果电脑和一份Xcode 4.2.如果你想要在iOS真机设备上运行你的程序,那么你还需要准备一个兼容的设备(iPhone.iPod touch或者iPad),并且还需要有相应的开发证书/供给配置文件(developer/ provisioning profiles).我们将在第3章"应用程序体系结构"一节中进一步阐述供