http://www.cnblogs.com/gleam/archive/2013/05/12/3073778.html#2678616
一、 概要
AQtime是一个在性能分析和资源调试中非常好的工具软件。不用修改任何代码,就能直接进行分析。丰富的分析方法,能非常轻松的搞定32位和64位应用程序性能问题、资源和内存泄漏。详细的报告不仅仅能告诉你性能的瓶颈或内存泄漏,还能知道那些模块、类或代码导致的问题,能快速定位问题或错误进行修正。
网站:http://smartbear.com/products/qa-tools/application-performance-profiling
二、 支持的开发工具和应用程序
支持目前流行的编辑器和开发工具,比较可惜的是只支持windows系统。
1、 支持应用程序类型
所有32为和64为的可执行类型
- 可执行文件(EXE)
- 动态链接库(DLL)
- 控制面板扩展(CPL)
- Embarcadero IDE包(BPL)
- ActiveX库
- COM,DCOM和COM +服务器
- Services
- ISAPI扩展
- ASP.NET应用程序
- Java应用程序
- Silverlight应用程序
- VBScript和JScript代码的网页和TestComplete项目
2、 支持.NET应用程序
AQtime PRO可以分析托管,非托管和混合的代码项目。它支持所有NET语言,并可分析微软与微软和非微软的编译器创建的32位和64位.NET应用程序。.NET Framework版本1.0,1.1,2.0,3.0,3.5和4.0。
3、 支持机器码(非托管)应用程序
- Microsoft Visual C++ 4, 5, 6, 2002, 2003, 2005, 2008, 2010
- Microsoft Visual Basic 6.0
- Embarcadero Delphi 2010, XE and XE2
- CodeGear Delphi 2007 and 2009 for Win32,
- Borland Delphi 2005 and 2006 for Win32,
- Borland Delphi ver. 2, 3, 4, 5, 6, 7
- Embarcadero C++Builder 2010, XE and XE2
- CodeGear C++Builder 2007 and 2009,
- Borland C++Builder 2006,
- Borland C++Builder ver. 3, 4, 5, 6
- Intel C++ ver. 7.0
- Borland C++ ver. 4.5 and 5.x
- GNU Compiler Collection ver .2.95 and later
- Compaq Visual Fortran ver. 6.5
4、 支持的Java应用程序
AQtime Pro支持所有1.5和1.6平台上的应用程序。
5、 支持的Silverlight应用程序
AQtime Pro可以使用Silverlight 4中创建的丰富的互联网应用程序进行概要分析。(被M$抛弃的孩子)
6、 支持的脚本代码
AQtime PRO可以分析通过微软脚本引擎执行的VBScript和JScript代码。
三、 分析类型
- 性能方面(Performance)
- 性能分析(Performance Profiler)
- BDE SQL
- 分配方面(Allocation)
- 程序内存分配(Allocation Profiler)
- 资源分配(Resource Profiler)
- 引用计数(Reference Count Profiler)
- 覆盖范围
- 静态分析
- 跟踪
四、 实例应用
1、 创建一个AQtime项目
操作方法
- 文件->创建项目
- 加入测试工程
注意:加入的工程可能会出现没有调试信息( no debug info)一种情况,如下图
这时需要在编译器中打开调试信息。以Delphi7为例,打开工程选项Linker页签中打开TD32调试信息,重新编译
2、 性能分析
1)操作步骤
- 选择性能分析
- 选择程序运行
- 正常操作功能
- 退出程序
- 自动生成报告
2) 报告分析
生成的报告页面如下图
3) 报告列信息
报告中有很多信息可以查看,需要根据实际的分析方法有选择的显示。下面只列出后面分析所需要的信息。
- 1 Unit Name 单元名称
- 2 Class Name 类名
- 3 Routine Name 跟踪项名称,一般是函数名称
- 4 Time 整个测试中当前项所消耗的所有时间,除子函数外。
- 5 Average Time 当前项在整个测试过程中平均每次所消耗的时间。
- 6 Time with Children 此项中包含所有可被检测子函数的占用时间
- 7 Shared Time 子项目所占当前项目的百分比
- 8 Hit Count 当前项中在整个测试过程中的调用次数
4) 解读方法
按调用次数排序可以看到IsSeparator这个函数调用非常频繁,可以尝试优化这个函数。
根据时间(Time)进行排序,看那项所消耗的时间最长。可以看到在整个测试过程中PrintRegInfo这个函数使用的时间最长,最简单的方法就是优化这个函数。
通过上述的2种方式能比较简单的进行优化。在实际情况下可能这个函数即使你优化了也可能收效甚微,必须通过多种方式去确认函数的优化成功是最突出的,需要综合考虑时间、子项时间和调用次数。
5) 相关分析工具
单靠上面的包括要进行代码优化是比较困难的,可以结合提供的一些工具试图进行分析。
A. Call Graph
能看出函数之间的调用关系和时间的消耗。这种图形方式比较直观,但调用关系的显示深度比较少。
B. Call Tree
Call Tree弥补了图形显示调用关系深度不足的问题,但他只能显示一个方向的函数调用关系,
6) 一般优化规则
- 优化调用次数相对比较大的项
- 优化函数占用时间比较长的项
3、 内存分配分析
内存泄漏分析的工具有很多EurekaLog、FastMM我们比较常用,只能对单一进程的程序进行分析,AQtime可以对整个工程组进行分析。功能比较强大,使用也比较复杂。对相对比较独立的程序建议用EurekaLog。
1) 操作步骤
- 选择程序分配分析
- 选择程序运行
- 运行功能
- 关闭程序
- 生成报告
2) 报告分析
3) 报告信息
- 1 Class Name 类名
- 2 Module Name 模块名
- 3 Total Created 创建总量
- 4 Peak Created 峰值数量
- 5 Live Count 泄漏数量
- 6 Total Size 总占用内存量
- 7 Peak Size 峰值占用内存量
- 8 Live Size 泄漏内存量
在报告中可以按到内存泄漏的情况。上面的运行报告中执行完程序有2个对象未被释放,分别是TList和VCL内存分配。使用这个方法基本可以分析出在整个监控范围内所泄漏的信息,但实际要定位到泄漏位置比较困难,只能通过对代码的分析找出位置。
4) 运行时内存监控
在检查泄漏中提供了一个比较有用的监控视图,可以在运行期间看到在对象生命周期内所有被分配的对象。
4、 片段分析方法
在前面讲述的都是在一个完整软件运行过程中的测试情况,整个过程耗时比较长并且涉及的内容非常多。在很多情况下只要对功能的部分进行分析,清除不必要的信息并减少分析报告的复杂度。
在运行期提供了一下3个方法。
- Disable Profiling --- 停止监控
- Get Results --- 获取内存中的报告
- Clear Results --- 清除内存中的报告
通过上述三种方法可以把不需要的信息剔除,这样就能得到只关注的信息。
五、 结束
AQtime这款工具软件功能很多而且都比较实用,上面只讲到了小部分内容。还有静态分析、覆盖范围和跟踪也都是非常实用的功能,能更深入的发掘并应用于日常工作,相信能极大的提供工程质量。其实我们在实际开发过程中能充分利用各种工具进行开发,不仅是在工程质量上而且在整个产品生产过程中会有相当大的促进作用。我们可以多发掘各类工具,应用在实际中。