洪宇 2013-10-28
测试我们的程序性能
在开发iphone程序的时候,如果程序会有较大的开销并且希望运行在配置较低的早期设备上,我们就需要解决一些在设备环境窘迫的时候出现的性能问题,程序性能优化调整上升为一个不可忽视的问题。
接下来介绍一些现有的一些测试工具,来帮助程序员发现热点,优化性能,解决程序bug。并希望以后可以出现的一些测试工具或方案。
代码分析程序。帮助分析代码性能,允许配置所有系统文件,方便调试各代码运行时间,以跟踪代码性能。
Xcode包含许多性能分析工具,其中有一个叫shark,位于/Develpoer/Applications/Performance Tools下,他最早是用于处理运行mac的程序,现在对于运行在iphone上的程序也有很大帮助。
作为没有mac开发背景的iphone程序员,不了解也是很正常的。即时现有iphone开发书籍也很少有介绍。还有一个原因可能是他的测试方式需要对程序员有更高的要求。程序员通过CPU时钟周期分析出程序的资源消耗热点,定位到代码中的位置。其实到现在我也不会很好的使用这个工具。
大致需要以下的步骤来完成测试和分析。
1. 在模拟器中构建运行程序,
2. 切换到shark设置,时间分析或其他方式,选择进程或者其他,选择指定的进程,
3. start,测试过程的操作,
4. stop,查看结果。
通过分析,可能是消耗过多的GUI布局,或者是无谓的计算等,最终发现热点用更有效的方法来消除热点
在配置好代码签名的环境,也可以测试和mac相连的ios设备,选择其中相关远程调试选项即可开始,手头没有设备的环境,没有测试。
shark有效但是还是有一定的局限性:它把在他的取样周期中的所有活动同等对待,无法捕捉一小段时间,而这段时间里也许有一些其他的外部事件,做了有趣的事情,会导致其他的结果出现。
性能测试工具,收集程序运行数据,帮助分析程序运行。
他的出现解决的shark的不足的地方,Instruments维持一个程序关于时间的活动记录,并把它显示在一条时间线上,可以看到程序在生命周期中活动的响应,程序是如何消耗cpu,内存和其他资源的。很直观的通过图形界面得出了分析结果,程序很容易就可以定位到问题代码的位置。
这是一个iphone开发书籍必备内容,现在主要是用来检查内存泄露,你可以通过网络或其他书籍来了解Instruments其他详细的功能,这里就不在赘述了。或者你也可以直接开始,我相信你很快就可以掌握其使用方式,Instruments对程序员的要求很简单。
不过其实各有利弊,Instruments呈现的更多是分析的结果,也许会掩盖一些问题。有时候其实我们也希望通过shark的原始底层数据来更加精确的解决问题所在。
这是一个LLVM的开源项目,更具体的信息可以通过其网站来了解。
静态分析器不是在程序运行时检查代码,它是一个代码静态分析工具,通过自身的技术建模并试图发现那些易于识别的错误。
Clang其实是集成在GCC编译器中的,并不一定需要xcode工具,也可以通过命令行配置来执行。
在xcode中使用非常简单,没错,只需要点击Build and analyze就坐等看结果了。
在制作下面这张截图的时候,我发现并解决了工程中的几个内存泄露和删除一些无效分支的死代码。
Clang主要可以分析得出以下这些问题
l 内存泄露
l Retain和release的正确使用
l 未初始化的变量
l 未使用的变量
l 无法到达的代码路径
l 引用空指针
l 除零
l 死存储(赋值非从未使用的变量)
l 类型不兼容的oc方法签名
l 缺少dealloc
在应用程序的生命周期中,有很多的对象被创建,因此要发现一个较长时间内稳定但是泄露缓慢的对象的错误可能是比较困难的。Scan-build能捕捉到这样的引用技术错误。试图写一个已释放的变量会导致崩溃,静态分析器发现可以减少测试人员和用户的痛苦。
静态分析器可以遍历所有可能的路径并发现那些可能的会错过的错误。
我们还有单元测试包( Unit test bundle),单元测试其实应该是开发的一部分工作,单很多时候我们并没有这样做。
看看截图中的那些灰色的选项,有一个UI Recorder选项,这是一个已经Mac上存在的测试工具,顾名思义,它是一个类似于windows的Winrunner的自动化测试工具。
UI Recorder通过记录一些与GUI的交互操作,通过自动录制、检测和回放用户的应用操作。
l 发现那些依赖于应用程序使用方式的的性能问题。就算只是通过简单的机械重放,通过可以发现bug的重现规律,可以发现可能需要和用户指定的交互动作才会出现的问题。
l 可以自动进行需要的压力测试,通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题。
l 有效地帮助测试人员对复杂应用的不同发布版进行测试,提高测试人员的工作效率和质量,确保跨平台的、复杂的应用无故障发布及长期稳定运行
相信以后有机会能够移植到iOS上的。