`
congfeng02
  • 浏览: 195602 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

自制性能测试类

阅读更多

自制性能测试类
赵湘宁

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

自动化与简易性设计

利用类对象构造函数和析构函数的执行特性(它们分别在声明和销毁时执行),性能测试类的计时是在构造函数开始的,计算与报告某个操作的执行时间是在析构函数中进行的。测试仪提供毫秒级的结果。实现过程中将使用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
转换成秒数: 0.027

也就是说赋值不影响性能。

性能测试常常需要一些技术实践。开发人员的直觉常会令人误入歧途-直观上开销很大的操作往往对性能影响不大,而一些表面上无所谓的操作象动态内存分配证明了在内存开销上对CPU的依赖。所以说如果没有可靠的性能测试作为手段,我们是很难发现性能事实的。
分享到:
评论

相关推荐

    高性能丙烯酸类混凝土裂缝修补材料的制备 (2013年)

    以甲基丙烯酸甲酯为主剂、甲基丙烯酸丁酯为增韧剂、环氧树脂为改性剂,在过氧化苯甲酰和自制胺类体系作用下,采用正交实验开展了高性能丙烯酸类混凝土裂缝修补材料的制备研究,分析了各组分用量对修补材料初始黏度、抗...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    CLR.via.C#.(中文第3版)(自制详细书签)Part2 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队合作...

    Linux系统设计-《30天自制操作系统》 linux version

    所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多...

    Linux系统设计-《30天自制操作系统》在Linux下的实践

    所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多...

    三乙醇胺、糖蜜对矿渣粉磨和矿渣水泥性能的影响 (2009年)

    研究了三乙醇胺、糖蜜两种物质在不同掺量下对矿渣的粉磨作用,采用自制设备测量了休止角,并做了质量比为50%矿渣+50%硅酸盐水泥配置的矿渣水泥的性能测试。试验结果表明:两类物质都有良好的助磨效果,能够显著降低筛余...

    煤基碳纳米片宏观体的结构调控及电化学性能-论文

    以自制煤基石墨为原料,采用液相氧化-热还原工艺制备三维层次孔煤基碳纳米片宏观体(CCNSs),利用扫描电镜(SEM)、透射电镜(TEM)、低温氮气吸附仪、X射线衍射(XRD)、拉曼光谱(Raman)和X射线光电子能谱(XPS)等手段表征...

    聚烯烃木塑复合材料的表面涂饰性能1) (2013年)

    选用木蜡油、丙烯酸酯、聚氨酯、氟碳、有机硅和丙烯酸聚氨脂等6类共16种涂料,以自制的聚乙烯(PE)基木塑复合材料和聚丙烯(PP)基木塑复合材料为试材进行了涂饰,通过涂料接触角和漆膜附着力测试等方法对木塑复合材料...

    软件概要设计方案.doc

    录 1 关键技术方案选择 1 1.1 关键技术一 1 1.2 关键技术二 2 2 架构设计 (SOP-0001) 3 3 系统功能设计 4 3.1 xx功能设计方案 (SOP-0005) 4 4 关键类或数据结构设计 (SOP-0002) 4 5 关键算法设计 (SOP-0003)...

    IQC电子基础知识培训

    4.3合格质量水平:A类不合格 AQL=0.4 B类不合格 AQL=1.5 替代法测试的 物料必须全部满足指标要求。 4.4 定义: A类不合格:指对本公司产品性能、安全、利益有严重影响不合格项目。 B类不合格:指对本公司产品...

    电源技术中的一种新型智能电子负载的设计

     电子负载具有体积小,调节方便,工作方式灵活,性能稳定,精度高等优点,被广泛应用于电源类产品和各类电子元器件的实验.测试.检定和老化环节.该方案基于51单片机,设计了一种智能电子负载,与其他同类设计相比,...

    51单片机工作实例随书光盘

    实例中所用的器材,取材容易,适合读者自己动手来做,特别适合电子技术类专业的大学生作为动手实践的教材,弥补他们在就业时缺乏实践经验的不足。本书涉及了电子工程应用的诸多方面,可作为各类单片机应用开发工程师...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    14.5 性能测试 181 14.6 使用Mock对象 184 第3部分 Rails框架 187 第15章 深入Rails 189 15.1 Rails在哪儿 189 15.2 目录结构 189 15.3 Rails配置 195 15.4 命名约定 197 15.5 Rails的日志 200 15.6 调试信息 200 ...

    Java开源的下一代社区平台Symphony.zip

    对于测试帖,可以使用 Sandbox 机制:带有 Sandbox 标签的帖子将视为测试帖,不会显示在首页或是某领域内,只会展现在发帖者自己的帖子列表中。 人性化的回帖交互 实时呈现:回帖提交后其他浏览者可以不刷新...

    Python基础教程(第3版)-201802出版-文字版

    久负盛名的 Python 入门经典针对 Python 3 全新升级十个出色的项目,让你尽快可以使用 Python 解决实际问题目录第 1章 快速上手:基础知识 ........................ 1 1.1 交互式解释器 .............................

    Linux多线程服务端编程:使用muduo C++网络库

    5.2性能需求. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 112 5.3多线程异步日志. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 114 5.4其他方案. . . . . . . . . ....

Global site tag (gtag.js) - Google Analytics