当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 自制性能测试类

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 自制性能测试类


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 45 ::
收藏到网摘: n/a

自制性能测试类
赵湘宁

    商业软件包往往价格昂贵,并且需要一个过程之后才能有效地使用它们。针对这一点,本文拟实现一个简单有效的类,它能自动计算并报告函数、循环和代码块执行的时间。

自动化与简易性设计

    利用类对象构造函数和析构函数的执行特性(它们分别在声明和销毁时执行),性能测试类的计时是在构造函数开始的,计算与报告某个操作的执行时间是在析构函数中进行的。测试仪提供毫秒级的结果。实现过程中将使用clock()返回程序开始后的处理器时钟时间(与平台相关的时间单位)。宏CLK_TCK表示特定机器每秒时钟数。

性能测试类定义如下:

#include <time.h>

class stopwatch
{
public:
stopwatch() : start(clock()){} //开始计时
~stopwatch();
private:
clock_t start;
};

    构造函数将成员start初始化为当前的时钟。除了析构函数外没有定义其它的成员函数。析构函数再次调用clock(),计算构造对象后经过的时间并显示结果:

#include <iostream>
using namespace std;

stopwatch::~stopwatch()
{
clock_t total = clock()-start; //获得所用时间
cout<<"此操作所用时间: "<<total<<endl;
cout< <"转换成秒数: "<< double(total/CLK_TCK) <<endl;
}

    注意clock_t和CLK_TCK是整数。因此在进行除法操作前必须将它们转换成double类型。为了延时屏幕输出,在析构函数中可以加上下列代码:

char dummy;
cin >>dummy; //延时屏幕输出

另外也可以将不同性能侧面的结果写入性能日志文件。

用所创建的类测试性能

    为了对代码块进行测试,先在代码块的开始创建一个本地类实例,假设要测试的代码是下列循环:
string *pstr[5000]; //指针数组
for (int i=0;i<5000;i++)
{
pstr[i] = new string;
}

此循环在堆中分配5000个串对象。

用大括弧将上面的代码块括起来并在代码块开始声明类对象实例:

{
stopwatch watch; // 开始计时
string *pstr[5000];
for (int i=0;i<5000;i++)
{
pstr[i] = new string;
}
} // 摧毁计时器并报告结果

    根据上面的代码段,当代码开始执行时,计时也开始,当代码退出时,析构函数便显示结果:

此操作所用时间: 27
转换成秒数: 0.027

    循环在运行这段代码的机器上耗时27毫秒。现在对上面的代码段稍做改动,使用栈动态分配内存会得到什么样的性能数据呢?
{
stopwatch watch;
for (int i=0;i<5000;i++)
{
string s;//创建并销毁本地的自动创建的串
}
}

这段代码运行结果为:

此操作所用时间: 14
转换成秒数: 0.014

    可以看出,用栈代替堆分配内存速度提高了50%。而且使用堆内存的代码还不包括销毁5000个串所用的时间。使用栈内存的代码不存在这个问题。由此很容易看出性能差别。

另外,使用堆内存的代码还有5000个赋值操作:

pstr[i] = new string;

将代码改动一下:

{
stopwatch watch;
for (int i=0;i<5000;i++)
{
new string; // 不用赋值的堆内存分配
}
}

    通常的代码是不能这样写的-原因是这样的代码造成严重的内存溢出。但它把分配操作与其它的变量隔离开了。这段代码不是以赋值方式进行堆内存分配,这是性能调整时常用的方法,其运行结果如下:

此操作所用时间: 27<