51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2525|回复: 3
打印 上一主题 下一主题

[转贴] iOS 性能专项初探

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-22 10:52:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言
iOS性能测试是什么?
iOS性能测试是指基于iOS平台从:
资源消耗
内存泄露
流量消耗
耗电功率
渲染效果
加载时间
等等.....
这些方面配合一些对应场景去收集数据然后根据数据去分析和定位可能存在的问题!
为什么做这个性能测试?
其实在现在很多企业的功能测试和后台API的测试已经相对较为成熟尤其是功能测试。
但是即使是这样,尽管你的应用有多牛B,你的后台架构有多好,你别忘了你最终还是基于平台来跑,
所以你的应用在平台里面的运行效果不好(Crach率高达百分之几十,内存泄露遍布整个流程)的话,其他的也都是多余的........
做完有什么用?
这个问题我只能说,只要自己用心去一项项去做!研究透!你会发现很多的问题!
比如你设计几个场景然后把这几个场景一个个单独跑一遍,把数据拿出来分析一下,你会发现资源占用较高或者内存泄露严重的步骤一步一步去检查代码会发现确实有问题存在,有可能是垃圾对象冗余,也可能是接口数据太大,json解析消耗较高或者其他等等.....
怎么去做?
Instruments 里面集成的很不错了!所以这里用Instruments 里面的工具来做的!
一项一项来:
1,资源消耗(Cpu、内存):
可以直接用Xcode真机Debug




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




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




关于:tableView:didSelectRowAtIndexPath ,分析下它的内存过程:
sushiString变量通过autorelease创建,它的引用计数是1.

这行代码使得引用计数增加到2, _lastSushiSelected = [sushiString retain];
这个方法结束时,sushiString的autorelease生效了,这个变量的引用计数减少为1
当再次执行tableView:didSelectRowAtIndexPath这个方法时,_lastSushiSelected被赋值了新指针,老的_lastSushiSelected的引用计数还是1,没有被释放,所以产生了内存泄露。
3,启动耗时
两种方法:一种使用NSLog,另外一种使用Time Profiler。
使用NSLog
  1. CFAbsoluteTime StartTime;
  2.     int main(int argc, char **argv) {
  3.      StartTime = CFAbsoluteTimeGetCurrent();
  4.      // ...
  5.        }
  6. - (void)applicationDidFinishLaunching:(UIApplication *)app {
  7.      dispatch_async(dispatch_get_main_queue(), ^{
  8.         NSLog(@"Launched in %f sec", CFAbsoluteTimeGetCurrent() - StartTime);
  9.      });
  10.      // ...
  11. }
复制代码
使用Time Profiler
Instruments->Time Profiler
Profile你的app
切换到CPU strategy view,找到你的app启动的第一帧
搜索-[UIApplication _reportAppLaunchFinished]
找到包含-[UIApplication _reportAppLaunchFinished]的最后一帧,即可计算出启动时间




你也可以粗略看下把有波动的部分选上会有一个时间出来!
3,流量(Network):




4,加载时间(Time Profiler):
当我们发现App有点卡的时候,可以通过Time Profiler来看耗时在哪里。




右边的 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吧,我也在待研究状态,我怀疑这个工具并不是很准!




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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    无聊
    2024-7-12 13:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2017-6-22 11:10:53 | 只看该作者
    我问个问题。Network这个只有total的,你怎么过滤应用,或者针对应用场景怎么办
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3#
     楼主| 发表于 2017-6-22 11:19:30 | 只看该作者
    乐哈哈yoyo 发表于 2017-6-22 11:10
    我问个问题。Network这个只有total的,你怎么过滤应用,或者针对应用场景怎么办

    NetReport 的total针对场景的话可以用步骤结束发送和接收的total减掉步骤前的total 就是步骤所消耗的total?
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-21 05:44 , Processed in 0.067748 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表