示例:性能测试工具GpProfile
1、准备工作
1.1、安装GpProfile工具
双击“/GpProfile/gpprf.exe”安装。
1.2、编写目标代码
备注:参考安装包自带的Profile.dpr工程。
1.3、设置编译选项
接下来就要编译运行修改后的代码了,注意要想编译添加了GpProfile Api调用的程序,我们要将GpProfile的安装路径添加到Library Path中,否则编译时,会提示无法找到GpProf.dcu。
2、开始测试
2.1、启动GpProfile工具
注意:对于Delphi2007只能手动启动GpProfile工具
(1)、GpProfile安装程序会在Delphi7的IDE的Tools菜单下添加两个菜单项:
*GpProfile
*GpProfile –remove instrumentation
(2)、点击GpProfile菜单将启动GpProfile后,GpProfile会自动加载当前IDE中的项目文件作为测试项目,示意图如下:
2.2、设置性能分析代码
在GpProfile 的主窗体中,在Instrumentation页中,我们可以看到测试项目中的全部的函数和类的全部过程和函数。选中某个方法后,会在下面的编辑框内显示相应的代码的预览,选中方法前面的CheckBox则表示GpProfile会分析该函数或过程的性能执行情况。
完成选择之后,点击菜单Project | Instrument,GpProfile会修改工程的源代码,添加GpProfile Api的声明,这时我们在Delphi IDE 中会收到一个源代码变更,要求重新载入源程序的消息。选“ 确定”后,就会看到修改后的代码了,代码示意如下:
procedure TForm1.SelectionSort(var A: array of Integer);
var
I, J, T: Integer;
begin
{>>GpProfile}
ProfilerEnterProc(1);
try
{GpProfile>>}
for I := Low(A) to High(A) - 1 do
for J := High(A) downto I + 1 do
if A[I] > A[J] then
begin
T := A[I];
A[I] := A[J];
A[J] := T;
end;
{>>GpProfile}
finally
ProfilerExitProc(1);
end;
{GpProfile>>}
end;
其中被包围在{>>GpProfile}{GpProfile>>}和{>>GpProfile U}{GpProfile U>>}等标记之间的代码就是GpProfile的性能分析代码。
2.3、运行目标工程
编译运行修改后的代码。运行程序直到应用程序结束,GpProfile Api会自动在应用程序所在目录生成*.prf 文件,这是分析性能的记录文件。
2.4、查看测试报告
(1)、打开测试报告
如果在运行应用程序时, GpProfile打开着。那么,应用程序运行结束时,GpProfile 会自动打开测试报告。否则,你应该在GpProfile的主界面中,选择Profile/Open 菜单,到应用程序所在目录中去打开测试报告。
(2)、查看测试报告
打开测试报告后,我们在主界面中切换到Analysis页就可以看到性能报告了,示意图如下:
报告分为下面几列:
Procedure:显示我们选定的要分析的方法名称
%Time:显示各个方法运行时间相对于总的运行时间的百分比
Time:实际的运行时间的秒数
W/child:子函数占用时间
Calls:表示被分析的方法运行的次数。(有时一次运行给出的性能数据可能不稳定,可以多次运行取结果平均值)
Min/Call:多次调用时,所用的最少时间
Max/Call:多次调用时,所用的最多的时间
Avg/Call:多次调用时,每次的平均时间
(3)、测试结论
从图中可以看出,三种排序法中快速排序的效果是最好的,对于15000个元素的数组,速度是起泡排序的745倍,是选择排序的253倍。想像一下,如果在你写的Delphi程序中有30个过程的算法是类似于起泡排序这样缓慢的算法的话,我敢打赌使用了30个类似于快速排序的算法的Java程序一定比你的Delphi程序快20倍。估计那时你的老板一定会让你转行去煮咖啡了。
2.5、移除性能分析代码
GpProfile在我们的代码中加入了很多自定义的标记和Api调用,如果要手工地删除,实在是很不方便,幸好点击Project | Remove Instrumentation就可以将代码中插入的{>>GpProfile}等标记自动删除了,不过为了保险起见,我建议你还是在Remove Instrumentation之前备份一下代码,以免造成损失。