性能测试-函数性能分析篇
-Quantify
在利用ACT(Application Center Test)进行压力测试后,如何对发现性能问题的模块进行定位,发现性能瓶颈所在,这就需要大家了解一个性能分析工具,Rational Test Suite中的Quantify。Quantify是一款面向VB,VC,JAVA的函数级性能分析工具,它可以自动的检测出影响程序运行的性能瓶颈,同时提供图形化的分析表格,帮助程序员进行性能的分析与优化。
在性能优化的过程中,一些程序员往往是凭着经验去分析自己所写的代码,找到性能瓶颈,这样会面临两个问题:
1、 程序员所找到的性能瓶颈的代码很可能是自己认为不合理的算法,但在优化的过程中大家都知道性能的优化往往不是优化算法不合理的,而是主要优化占用时间最长的函数;
2、 在一个大型的项目中,如何在成千上万的代码中找到性能瓶颈是一个最头痛的问题,如果自己不了解所在的项目那就更无法下手;
那么如何高效的提位问题,而不是通过代码的检查发现问题则是关键,而Quantify则是一款这样的神兵利器。
Quantify有以下几个特色:
1、 对当前的开发影响特别的少,还集成在一些通用的开发工具中,大大的增强了使用的容易度,比如Visual Studio;
2、 性能的显示以图形的方式进行,可以很直接的了解到性能所在的瓶颈;
3、 无需源代码就可以对大多数的系统进行性能的分析;
4、 同时显示的函数的信息非常的详细,包含了调用的次数,时间等,还有相关的调用关系;
5、 在测试功能的同时,对性能进行分析,不需要额外的辅助代码;
下面则是通过一个例子来详细的介绍如何使用Quantify进行性能分析并发现问题,这里我用CPPUnit写了一个测试用例,用来测试一段性能有问题的代码(代码就不发出来了,呵呵),主要通过它让大家了解Quantify是一个很简单的工具:
l 对性能的测试只需要运行编译好的程序,如图:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 318pt; HEIGHT: 173.4pt" type="#_x0000_t75"><img src="/Develop/ArticleImages/24/24857/CSDN_Dev_Image_2004-2-26014010.jpg" o:title="Quantifystart"><font size="3"></font></shape>
如图1
l 生成的结果如下图2,特别的简单:
<shape id="_x0000_i1026" style="WIDTH: 345pt; HEIGHT: 191.4pt" type="#_x0000_t75"><img src="/Develop/ArticleImages/24/24857/CSDN_Dev_Image_2004-2-26014012.jpg" o:title="Quantify2"><font size="3"></font></shape>
如图2
不过要快速的分析,主要有以下几点,首先给大家介绍几个知识,算是了解一下,如果需要详细的了解,这些是远远不够的:
1. Function Time :函数本身执行的时间,它不包含子函数的时间;
2. F+D Time(Function+Descendants):函数本身与函数调用的子函数执行的时间;
3. Calls:函数在执行过程中调用的次数;
4. F Time(%):是函数本身(不包含子函数)占用整个系统运行时间的百分比;
5. F+D Time(%):是函数本身消耗时间加子函数时间占整个调用时间的百分比;
6. Avg F(Time):主要指函数平均运行时间;
7. Min F(Time):函数调用过程中最小的运行时间;
8. Max F(Time):函数调用过程中最大的运行时间;
9. Module:是那个DLL调用的;
在性能分析过程中,有一个原则就是优化占用时间最长的函数或是占百分比最长的函数,所以一般我会先关注Function Time与F Time(%),对此进行排序,从而发现性能上的问题,当然要与自己的系统相关的模块,如图:
<shape id="_x0000_i1027" style="WIDTH: 450pt; HEIGHT: 418.8pt" type="#_x0000_t75"><img src="/Develop/ArticleImages/24/24857/CSDN_Dev_Image_2004-2-26014014.jpg" o:title="Quantify3"><font size="3"></font></shape>
如图3
这里你们可以看到与自己系统相关的是系统的输出函数,它的calls次数非常的高,同时占用时间与百分比也非常的多,呵呵,这时你就可以知道这是与系统相关的性能瓶颈,我的代码中也是这样写的,呵呵。
//演示性能测试
void CMabString::DemoPer()
{
cout<<"Begin Performance\n";
int Result =0;
for (int j=0;j<1000;j++)
{
cout<<"This is Performance Test\n";
}
cout<<"End Performance\n";
}
当然你还可以通过图形来发现你的函数由那些子函数组成,如图:
<shape id="_x0000_i1028" style="WIDTH: 414pt; HEIGHT: 282pt" type="#_x0000_t75"><img src="/Develop/ArticleImages/24/24857/CSDN_Dev_Image_2004-2-26014016.jpg" o:title="Quantify4"></shape>
如图4
从这里你可以看到CmabString::DemoPer下面调用的子函数是osteam,调用的次数是1002,占性能的99.80%;同时还可以看到上一级函数,也就是调用CmabString::DemoPer的函数MathTest::testDemPer,通过图形可以看到函数之间的调用关系,同时可以通过关联深入跟踪它的调用关系与性能情况,还是特别的方便的,不过要注意的是,有可能子函数调用的次数与占用的性能甚至可以超过上一级函数,为什么,主要是这里显示了整个过程的调用次数,也就是说可能在其它地方也调用了此调用了此函数,所以这是一个很正常的现象。不过如果对系统不熟或是对工具不熟也会点的晕头转向,我已经晕了不知多少次了,哈哈。上面的例子则是很简单的,就是循环占用了时间。
上面的分析只是定位到函数,但是否可以定位到源码级吗?答案是肯定的。只要有源代码,则可以从源码级进行分析,你可以清楚的看到每一段代码的执行时间,与函数执行时间,通过这种方法你可以更快的定位问题,如下图:
<shape id="_x0000_i1029" style="WIDTH: 405pt; HEIGHT: 328.2pt" type="#_x0000_t75"><img height="1026" src="/Develop/ArticleImages/24/24857/CSDN_Dev_Image_2004-2-26014018.jpg" width="1113" o:title="Quantify5"></shape>
图5
这里LineTime就是这行本身执行时间,Line+D是行执行时间与子树执行的时间,通过源码级的分析可以看到这段代码的性能瓶颈就在for循环内,当然不一定可以优化,但如果可以优化则会提升的最明显。
但性能问题不仅仅是代码[写的不好,还有一些是数据库的问题或是网络传输等等问题,当你发现如果是调用数据库方法出问题或是网络库出问题时,可以转入对网络库或是数据库的分析。
Quantify还有其它很方便的地方,比如分析结果的保存很方便,支持多种语言,当然工具不是万能的,最主要的是人的因素,希望能够通过工具提高你的性能分析能力。
分享到:
相关推荐
### 笔记:用LR做Web性能测试---简单入门 #### 一、LoadRunner简介与安装 **LoadRunner**(简称LR),是一款知名的性能测试工具,由Micro Focus公司开发维护,广泛应用于各种软件产品的性能测试中。它能够帮助...
本例提供一个简单的阿克曼函数调用源码。...Ackermann函数的性质和性能是计算机科学中很多问题的研究基础之一,因为它提供了一个简单而且高度复杂的计算任务,可以用来评估计算机程序的性能和效率。
5. **分析结果**:最后,分析性能测试的结果,查看是否存在性能瓶颈,根据参数化数据的变化来评估系统的响应时间、吞吐量和资源利用率。 学习和掌握LoadRunner的参数化连接设置是提升性能测试技能的重要步骤,它...
4. 性能测试:除了验证正确性,还要关注算法的运行时间、内存使用等性能指标。 5. 单元测试与集成测试:单元测试专注于单个函数,而集成测试则检查多个组件协同工作时的行为。 在压缩包中的“35个标准测试函数及...
CEC 2005提供的测试函数库为研究者提供了评估和比较各种优化算法性能的标准平台。 **CEC 2005测试函数的分类:** CEC2005包含了三类不同的测试函数: 1. **单峰函数(Single-Objective Functions)**:这类函数...
### Spark性能测试报告-Spark SQL在不同存储格式下的性能对比 #### 测试目的与背景 本文旨在通过一系列的实验对比Spark SQL在不同存储格式(包括txt、Parquet、Ya100)下的性能表现。考虑到不同的机器环境及配置...
算法设计与分析-排序算法性能分析大礼包 包括题目要求pdf,报告文档,c++源代码,pre ppt 选择排序 冒泡排序 插入排序 合并排序 快速排序算法原理及代码实现 不同排序算法时间效率的经验分析方法 验证理论分析与经验...
在优化领域,标准测试函数是评估和比较不同优化算法性能的重要工具。这些函数通常具有已知的全局最优解,或者具备特定的复杂性,如多模态、非线性、约束等特性,使得它们能够全面地检验优化算法的寻优能力和稳健性。...
软件测试-单元测试集成测试系统测试性能测试 软件测试是软件工程中一个非常重要的环节,它涉及到软件开发的各个方面,包括单元测试、集成测试、系统测试、性能测试等。下面我们将对这些测试环节进行详细的解释。 1...
"算法测试基准函数"是一组专门设计用于评估和比较不同智能算法性能的数学模型。这些函数通常具有不同的特性,如多模态、非线性、全局最小值等,能够模拟实际问题的复杂性。下面我们将深入探讨这些知识点。 首先,...
通过查看这些文件,开发者可以了解不同测试函数的实现细节,分析它们的性能,并对比不同算法在这些测试函数上的表现。这有助于优化算法,提高软件质量,减少bug,并且对于教学和研究也有很大价值。 总的来说,测试...
本资料包详细介绍了Ruby性能测试的各个方面,包括测试工具、方法、策略以及如何分析和优化测试结果。 1. **性能测试工具**: - `Benchmark`: Ruby内置的基准测试库,用于简单的性能比较,可以测量代码执行时间。 ...
- **性能测试基本过程**:包括规划、设计、实施、分析和优化等阶段。 - **性能评估模型**: - **性能评估模型概述**:介绍了一个综合性的模型来评估系统的性能,涵盖各种关键性能指标(KPI)。 - **闭环流程图**:...
在多目标优化领域,有一些经典的测试函数被广泛使用来验证和评估优化算法的性能。这些函数通常是设计得具有一定的挑战性,以便模拟真实世界中的复杂问题。MATLAB作为一款强大的数值计算软件,是进行多目标优化研究和...
6. **如何做好性能测试**:选择合适的工具、设计有效的测试场景、正确分析测试结果。 #### 二、LoadRunner基础知识 1. **LoadRunner简介**: - **主要特点**:LoadRunner是一款由Micro Focus公司提供的性能测试...
在多目标优化领域,ZDT(Zitzler-Ehlenfeld-Tuza)和DTLZ(Deb-Thakur-Lahiri-Zitzler)函数集是广泛使用的基准测试函数,用于评估多目标优化算法的性能。这些函数设计复杂,能够模拟实际问题中的非线性、多峰和不...
优化算法测试函数通常包括一系列精心设计的函数,这些函数具有特定的特性,如多模态、高维度、非凸性等,以便测试和比较不同优化算法的性能。例如,常用的测试函数有Rosenbrock函数、Beale函数、Ackley函数等,它们...
### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...
通过将这些测试函数作为目标函数,你可以评估你的算法在各种情况下的性能,并根据结果进行调整和优化。 此外,压缩包中的子文件可能包含了各种其他优化问题的实例,例如线性规划、二次规划、非线性约束问题等。通过...