用户不喜欢等待。他们不关心也不应该关心一个应用初始化的时候需要什么,他们只想尽快地完成他们的任务。你的应用应该几乎是瞬间启动的,其界面应当如丝般顺滑。在充满竞争的软件市场中,应用的性能是关键的优势之一。

作为开发者,我们也希望对我们辛苦开发的 app 感到自豪。

然而,性能优化是一个棘手的问题。大多数的瓶颈是反直觉的。如果没有合适的度量,找出拖慢 app 的原因是非常困难的。

要优化你的 app 的性能,你应该基于数据做决定。在这篇文章中我将会通过度量你的 app 的不同方面的性能,来展示如何得到这个数据。

我将谈及的方面是:

  • CPU,GPU,内存以及 app 的能源消耗;

  • 响应性;

  • 启动时间;

  • 从你的用户那里收集的性能指标;

让我们开始吧!

CPU,GPU,内存以及能源消耗

分析你的 app 的第一个任务,是找出过度使用 CPU, GPU 或者内存的低效代码。Apple 有一个很棒的工具 Instruments 来完成这个任务:

有4个主要的方面需要重点考虑:

  • CPU (“Time Profiler” 工具);

  • GPU (“Core Animation” 工具);

  • 内存使用 (“Allocations” 工具);

  • 电量使用 (“Energy diagnostics” 工具).

关于使用 Instruments 来分析 app 的最佳信息来源就是 WWDC 视频。

有一些入门的精华:

  1. Learning Instruments;

  2. iOS Performance 1, 2, 3;

  3. Improving You App With Instruments;

  4. Advanced Graphics & Animations for iOS Apps;

  5. Profiling In-Depth;

  6. Cocoa Touch Best Practices;

  7. iOS Performance and Power Optimization with Instruments;

  8. Polishing Your App.

响应性

下一个需要测量的重要的东西是 UI 的响应性。触摸的处理发生在主线程。主线程有耗时操作的时候,你的 app 变得反应迟钝。

即使有些操作并不使用 CPU,它们也可能会占用时间。如果主线程有同步调用,测量这些调用耗费的时间。

要测量这个,你可以使用日志。

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

// Your method

NSUInteger milliseconds = (NSUInteger)((CFAbsoluteTimeGetCurrent() — startTime) * 1000);

NSLog(“Done in %lu ms”, milliseconds);

Viber 的开发者描述了另一种方法。他们有一个特殊的线程用来监视主线程,并监测主线程的阻塞不会超过 400 毫秒。

测试响应性(来自 Viber 关于 NSSpain 的 PPT)

测试响应性(来自Viber关于NSSpain的PPT)

更多信息请参考 PPT原文 (PDF, 7MB)。

https://dl.dropboxusercontent.com/u/3820193/VbierClientUnderTheHood.pdf

使用这个数据来监测耗时太长的调用(400毫秒是一个不错的阈值,你可以读一下 这本书 获取更多信息),然后优化它们或者将其从主线程移出去。

启动时间

下一个需要测量的重要的事情是你的app启动有多快。典型的用户只会在你的app花费 几分钟时间。过长的启动时间会招致失望。

你的app有两种被启动的情况:

  • 冷 启动:你的 app 的进程没有在运行,它现在被操作系统启动。

  • 热 启动:你的 app 被最小化而没有杀死。它是从后台恢复的。

本章节主要讨论冷启动,因为这是更加资源密集的操作。

下图是一个 iOS app 的启动时序。

The Application Startup Phases (from the documentation) 应用启动阶段(来自这篇文档)

1. 测量启动花费的总时间

我们应当测量从 main() 的开头到 applicationDidBecomeActive: 末尾之间花费的时间。

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

// Save the initial time for startup

[[StartipTimeMonitor sharedMonitor] appWillStartLoading];

@autoreleasepool {

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

}

}

- (void)applicationDidBecomeActive:(UIApplication *)application {

// Your code

// We assume that the app is loaded then the main thread become free

// after this callback is finished.

dispatch_async(dispatch_get_main_queue(), ^{

[[StartipTimeMonitor sharedMonitor] appDidFinishLoading];

});

}

当你引入新特性的时候,确保启动时间不会变得更糟。试着将冷启动时间控制在 1 秒以内。

2. 测量启动时序阶段的时间

通常来说,只知道启动消耗的总时间是不够的。搞清楚启动时序中的哪个阶段拖慢了启动也很重要。

要考虑的最重要的阶段是:

  • -[AppDelegate application:didFinishLaunchingWithOptions:] — 当启动图(或故事板)显示的时候这个回调被调起。当你的 app从这个方法返回的时候,实际的UI立刻开始加载。

  • -[UIViewController loadView] — 如果你的app加载一个自定义的 view,这里是 view 初始化的地方。

  • -[UIViewController viewDidLoad] — view 已经被加载;最终的初始化的时间。

  • -[AppDelegate applicationDidBecomeActive:]— UI 已经被初始化,但是在这个

  • 回调完成之前UI仍旧被阻塞着。当你的 app 从后台被恢复时,这个方法也会被调用。

如果这些方法中的某些占用了过多的时间,优化它。

3. 测量“压力下”的启动时间

真实世界与典型的测试环境相比有一个重要的不同。

你的 app 在真实世界不是孤立存在的。

用户常常从另一个 app 切换到你的 app。这个“另一个 app”可能非常笨重。因此测量这些情景下的启动时间非常重要,那就是:你的 app 开始启动的同时,另一个笨重的 app 正在切换到后台,并试图保存它的数据。

那样的测试可以发现一些意想不到的结果。先前完全无害的代码,在那种情境下可能会显著地拖慢你的 app。

4. app 已经启动,但仍然不可用

如果你的 app 在已经加载完UI之后并不是立即可用,那么它并没有真正地完成加载。即使 UI 已经加载完毕并且有响应,但仍需要加载一些数据才能准备就绪,把这也算到启动阶段去。

从你的用户那里收集的性能指标

前述的所有测量方法在测试环境都可以使用。这些是必须的,但是并不高效。如果你的 app 很流行,如果你的用户群遍布全球,一些用户的环境可能跟你预期中的相差巨大。

他们可能有不同的:

  • 网络状况;

  • 硬件;

  • 软件(操作系统版本,越狱……);

  • 设备上的可用空间

  • 其他种种

他们也可能有不同的 app 使用方式。

即使你在实验环境中测试的所有指标都处在安全区间,你仍有可能得到带着抱怨的一星评价(“你的 app 太慢!”)。

对此应该做些什么呢?

定义一套性能指标(或 KPI),并从真实用户那里收集数据。你可以利用几乎任意的分析程序包来做这件事。

下面是你可以从用户那里得到的 KPI 的例子:

  1. 总的冷启动时间。

  2. 总的热启动时间。

  3. 启动阶段的启动时间。

  4. 从服务器下载必要数据花费的时间。

  5. 主线程阻塞超过400毫秒的次数。

  6. 内存警告的次数。

  7. FOOMS 的数量。

  8. UI 阻塞或不可用时操作的长度。

分析程序包将允许你把这些值以及设备类型、国家或网络运营商一起,分散存储到片段中。这些可能会让你洞悉用户遇到了什么样的性能问题,以及如何修复它。

结论

正如你看到的一样,性能度量不仅仅是运行 Instruments.app。还有其它有价值的地方值得考虑。

上述的一些方法实现起来简单快捷,另外一些则要求更多的时间和精力。然而,它们将帮助你监控你的app的性能,找出并解决问题,使你的app用起来更加有趣。

转载于:https://www.cnblogs.com/fengmin/p/5500391.html

iOS 应用性能测试的相关方法、工具及技巧相关推荐

  1. 25个增强iOS应用程序性能的提示和技巧 — 中级篇

    本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...

  2. iOS开发UI篇—IOS开发中Xcode的一些使用技巧

    iOS开发UI篇-IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文 ...

  3. android ui 切图工具,APP切图标注教程:UI设计切图标注的小工具实用技巧

    分享关于一篇UI设计师必须要懂的切图标注的小工具实用技巧,让你在跟开发工程师协作的时候更加得心应手. 设计师必备的UI切图小工具如下3大常用工具: 1.切图工具 Assistor PS 也是一款PS的 ...

  4. 安卓Android测试工具 和 苹果IOS集成调试测试环境工具(GT)

    安卓Android测试工具 和 苹果IOS集成调试测试环境工具(GT) 什么是GT? GT(随身调)是APP的随身调试平台,它是直接运行在手机上的"集成调试环境"(IDTE, In ...

  5. 分享iOS游戏/应用的营销及推广技巧(1)

    分享iOS游戏/应用的营销及推广技巧(1) 发布时间:2012-04-10 17:43:41  Tags: 分析API, 制作预告片, 营销及推广技巧, 预开发阶段 作者:Felipe Laso 欢迎 ...

  6. mac idea用自带的maven还是_苹果电脑自带截图工具怎么用?mac自带截屏工具使用技巧分享

    一说到截图工具我们脑袋里最先跳出来应该是 QQ 和微信等社交软件自带的截图工具,这里小编为大家推荐的是经常被忽昭略的mac自带截屏工具.也许你想不到苹果自带截图工具功能是十分的强大的. mac自带截屏 ...

  7. 软件测试性能测试结果,软件性能测试结果分析工具的研究与设计

    摘要: 随着软件行业的发展,针对软件系统尤其是Web应用系统的性能测试技术已经成为了软件测试领域的热点.虽然许多测试工具对性能测试提供了自动化支持,但性能测试的执行过程仍具有极高的专业性和复杂度,这一 ...

  8. Windows SharePoint Services 3.0编码开发工具和技巧(Part 1 of 2)

    转:http://blog.csdn.net/mattwin/article/details/2074984 WSSv3 Technical Articles_Windows SharePoint S ...

  9. IOS开发基础之音频工具类封装AVAudioPlayer

    IOS开发基础之音频工具类封装AVAudioPlayer 源码在我的主页下面 ,项目名称是AVAudioPlayer 关键性代码 工具类的封装 // // LJAudioTool.h // AVAud ...

最新文章

  1. PC微信逆向:分析通用设置数组
  2. jvm垃圾收集器的发展史及回收算法
  3. android binder与handler的简要理解
  4. LeetCode 1122 数组的相对排序-简单-unordered_map容器的应用
  5. div里面放ul,使ul横向和纵向滚动
  6. A Style-Based Generator Architecture for Generative Adversarial Networks---阅读笔记
  7. 【clickhouse】clickhouse 一些博客链接
  8. 掘金后端 mysql优化_vue服务端渲染项目(ssr)仿掘金、后台页面是react spa、服务层nodejs、koa、mysql编写的一套多权限内容管理系统...
  9. 帆软Tab控件与控制组件隐藏的异同点
  10. ZOJ Monthly, March 2018 A Easy Number Game
  11. windows配置路由表办公网和外网自动切换
  12. C语言图书用国际标准书号,图书登记管理系统程序ds.doc
  13. js正则表达式 验证非负数
  14. 各种国际搜索引擎广告入口
  15. 透视变换完成目标跟踪物体速度测试
  16. jitter 如何优化网络_PLL jitter 测试过大,如何优化?
  17. 【Scratch二次开发】05-翻译国际化
  18. python数组和函数的区别_真假美猴王-Numpy数据与Python数组的区别与联系!
  19. 吉林建筑大学计算机科学技术,吉林建筑大学计算机科学与技术专业2015年在吉林理科高考录取最低分数线...
  20. 180°舵机角度控制(mg996 + stm32F1)

热门文章

  1. C 语言的基本数据类型
  2. python 中用什么键缩进 —— tab 还是空格?
  3. contiki源码阅读之list
  4. 一文看懂Python(六)-----类与对象篇
  5. zcmu1550(字符串最小表示法)
  6. 汇编语言加法和减法详解
  7. 汇编语言布尔表达式(NOT、AND、OR)
  8. 反卷积在神经网络可视化上的成功应用
  9. 计算机软件可分为哪三类,系统总线是什么_系统总线分为哪三类
  10. c语言程序设计开卷考试b卷,C语言程序设计(B)试卷_杨崇联(A1).doc