iPhone浏览器性能测试

发表于:2016-3-01 10:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:百度MTC    来源:51Testing软件测试网采编

  【背景介绍】
  虽然iPhone的性能越来越好,但app的功能也越来越复杂,性能从来都是移动开发的核心关注点之一。我们说一个app性能好,不是简单指感觉运行速度快,而应该是指应用启动快速、UI反馈响应及时、列表滚动操作流畅、内存使用合理,当然更不能出现简单的crash了。
  那么iOS的性能测试是什么:资源消耗、内存泄漏、流量消耗、耗电功率、渲染效果、加载时间。。。
  以下将结合iPhone浏览器从启动时间、加载时间、内存占用、CPU和流畅度等维度介绍如何完成一个iOS app的性能测试。其中会用到Apple的性能分析神器”Instruments”。
  一、启动时间
  移动应用的启动时间是用户体验的一个重要方面,苹果一直建议尽可能的缩短启动时间,防止用户不愿意使用它们。对于浏览器而言,由于程序启动时还会有教育页和闪屏的下发,因此启动时间的获取显得尤为重要。
  启动时间分为冷启动时间和热启动时间,所谓的“冷启动”,就是一个完全没有运行的应用的启动时间,与热启动(应用已经在后台运行,某个事件将其带至前台)相比,由于此时系统尚未建立缓存,因此冷启动往往要较平时(热启动)耗费更长的时间。
  要获取准确的app启动所需时间,最简单的就是通过性能打点的方法。首先在main.c中添加如下代码:
  CFTimeInterval startTimeLog;
  int main(int argc, char *argv[]) {
  startTimeLog = CACurrentMediaTime();
  然后在AppDelegate的回调方法application:didFinishLaunchingWithOptions中添加:
  dispatch_async(dispatch_get_main_queue(), ^{
  CGFloat launchTime = CACurrentMediaTime() - startTimeLog;
  NSLog(@"launch: %f", launchTime);
  });
  可能你会疑问为什么这样可以获得系统启动的时间,因为这个dispatch_async中提交的工作会在app主线程启动后的下一个runloop中运行,此时app已经完成了载入并且将要显示第一帧画面,也就是系统会运行到-[UIApplication _reportAppLaunchFinished]之前。
  下图是用Instruments工具Time Profiler跑的调用栈信息。
  
  图1
  所以使用Time Profiler同样可以查看app的启动时间,具体方法如下:
  1.    Instruments->Time Profiler
  2.    Profiler你的app
  3.    切换到CPU strategy view,找到你的app启动的第一帧
  4.    搜索-[UIApplication _reportAppLaunchFinished]的最后一帧,即可算出启动时间(图中为_reportMainScreenUpdateFinished:)
  为了拿到真实的用户数据,追踪版本之间的数据变化,目前浏览器线上版本中启动时间已作为性能埋点上传,这样我们就可以计算出每日不同机型不同OS的平均启动时间,以帮助更加实时有效的监控线上的性能质量数据。
  二、网页加载时间
  据Google Analytics数据,目前移动网页平均加载时间至少需要7秒,Google的目标是把这个时间降至1秒,因为参考Nielsan Norman Group 的调查研究结果:如果移动网页加载时间超过 1 秒,用户就不愿停留在页面上了。
  在目前的技术基础上,在几百毫秒内加载数个网页几乎是不可能实现的,但在1秒内完成移动网页首页内容加载是有可能的,而剩余内容则慢慢加载。因此网页加载首屏展现时间成为了衡量手机浏览器的一个重要性能指标,计算方法为从开始加载网页到首屏内容全部展现所用的时间。
  网页加载时间同样可以基于打点的方法获得。移动网页的加载都是从Webview的url请求开始的,webview的操作都会有UIWebviewDelegate的方法代理完成,因此通过对webview代理方法的研究(见下图),选取正确的方法作为开始时间和结束时间,即可获取网页的首屏加载展现时间和网页加载完成时间。
  图2
  对于竞品,我们则可以在越狱机型上通过动态库hook的方法进行加载时间的计算,简单介绍如下:
  1.    class-dump-z命令获得应用程序的类信息
  a)      导出设备上预装应用的类信息(/Applications)
  b)      导出从AppStore下载的app的类信息,需要clutch命令破解(/var/mobile/Applications)
  2.    用GDB或Cycript进行运行时分析(Cycript是一个理解Objective-C语法的javascript解释器),hook当前运行的进程,打印当前运行的viewcontroller及对应的方法名;
  3.    动态库注入,执行method swizzling,在对应的方法中打印时间日志
  关于如何使用运行时分析及动态库注入,这里就不详细说明了。
  当然,加载时间的查看也可以借助于Apple的性能分析神器Instruments。当我们发现App有点卡的时候,就可以通过Time Profiler来查看耗时在哪里,如图突出的范围就是步骤消耗的时间。
  
  图3
  在这里同时分享一个基于摄像+分析的快速进行启动时间和加载时间计算的方法。当前手机的摄像头基本上都支持高FPS的拍摄,拍下来的MP4文件可以通过免费的Avidemux工具来看具体的帧信息,也可以看到帧的时间戳,根据拍摄的格式,目前我测试的视频可以达到30毫秒级别,完全满足性能测试的需求。
  三、内存测试
  iOS系统中内存限制是较为严格的,因此内存优化也就成了iOS app一直以来的难题。关于内存测试的方法有很多,可以直接用Xcode真机Debug查看,也可以通过Instruments中内存相关的模板Activity Monitor获得。
 
  图4 Xcode调试查看内存
 
  图5 Activity Monitor查看内存
  在实际性能测试中,内存测试往往会分场景进行,通过脚本模拟用户常用场景操作,分析该场景下的内存占用情况。
  1.    指定run.js脚本测试
  $ instruments -w ${UDID} -t ${template} ${APP} -e UIASCRIPT ${script} > .input.log
  2.    解析ActivityMonitor模板的trace文件,生成对应的json格式数据
  $ instruments_parser -p process_name -i result.trace
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号