副标题#e#
贸易软件包往往价值昂贵,而且需要一个进程之后才气有效地利用它们。针对这一点,本文拟实现一个简朴有效的类,它能自动计较并陈诉函数、轮回和代码块执行的时间。
自动化与浅易性设计
操作类工具结构函数和析构函数的执行特性(它们别离在声明和销毁时执行),机能测试类的计时是在结构函数开始的,计较与陈诉某个操纵的执行时间是在析构函数中举办的。测试仪提供毫秒级的功效。实现进程中将利用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;
}
} // 摧毁计时器并陈诉功效
#p#副标题#e#
按照上面的代码段,今世码开始执行时,计时也开始,今世码退出时,析构函数便显示功效:
此操纵所用时间: 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
转换成秒数: 0.027
也就是说赋值不影响机能。
机能测试经常需要一些技能实践。开拓人员的直觉常会令人误入歧途-直观上开销很大的操纵往往对机能影响不大,而一些外貌上无所谓的操纵象动态内存分派证明白在内存开销上对CPU的依赖。所以说假如没有靠得住的机能测试作为手段,我们是很难发明机能事实的。