商业软件包往往价格昂贵,并且需要一个过程之后才能有效地使用它们。针对这一点,本文拟实现一个简单有效的类,它能自动计算并报告函数、循环和代码块执行的时间。
自动化与简易性设计
利用类对象构造函数和析构函数的执行特性(它们分别在声明和销毁时执行),性能测试类的计时是在构造函数开始的,计算与报告某个操作的执行时间是在析构函数中进行的。测试仪提供毫秒级的结果。实现过程中将使用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的依赖。所以说如果没有可靠的性能测试作为手段,我们是很难发现性能事实的。 |
相关推荐
3. 电子元件识别和测试:学习如何识别不同系列的集成电路芯片,以及如何对这些芯片进行基本的电气性能测试。 4. 电路设计原理:理解集成电路测试仪的设计原理,包括电源、信号发生器、逻辑分析仪等关键部分的构成和...
通常,测试类会涵盖各种场景,如创建字符串、连接字符串、获取子串、比较字符串等,以确保自定义类的功能与内置String类一致。 通过编写和测试自定义的String类,初学者可以深入理解以下几个核心概念: 1. **对象...
"自制机器人倒退行走测试视频演示.rar" 这个标题揭示了主要的内容是一个关于自制机器人的倒退行走测试的视频文件,它被压缩在RAR格式的文件中。RAR是一种流行的压缩格式,用于减少文件大小以便于存储和传输。标题中...
9. **测试与优化**:在开发完成后,需进行多设备和多场景的测试,确保分类系统的稳定性和性能,并根据用户反馈进行迭代优化。 通过以上这些技术和方法,可以实现一个功能完善的“自制简单仿照京东商品分类”系统。...
使用单元测试确保代码的正确性,通过压力测试评估数据库在高负载下的性能,并进行相应的优化。 综上所述,创建一个内存数据库需要深入理解C#语言、数据结构、事务管理和并发控制。通过合理的设计和优化,自制的内存...
自制多用途稳压集成电路测试仪是一种简易而实用的电子设备,设计目的是为了方便地测试不同类型的集成电路,尤其是涉及稳压和电流控制的元件。这款测试仪的特点在于其线路简洁、成本低、制作简便且测试效率高,能适用...
在你的"MINST测试样本自制的160个"中,似乎你创建了一个自定义的MNIST测试集,包含了160个图像。这可能是为了测试特定神经网络模型在不同条件下的性能,或者是为了引入一些特殊的手写风格或噪声,以增强模型的泛化...
1. **测试工具**:测试工具在软件测试中扮演着重要角色,它们可以帮助测试人员自动化执行测试、管理和追踪缺陷、进行性能测试等。例如,用于模拟被子模块调用的程序可能是驱动器(Driver),它在测试中用来模拟实际...
这个自制的数据集可以作为检验模型性能的一个基准,或者用于测试新算法或优化技术的有效性。 数据集通常分为训练集和测试集。训练集用于训练模型,而测试集则用来评估模型在未见过的数据上的表现。在这个自制的...
8. **优化和测试**:不断优化代码性能,进行兼容性和安全性测试,确保浏览器在不同环境下的正常运行。 总的来说,使用C#编写自制浏览器是一项综合性的任务,涵盖了多种编程技术,同时也是一次深入学习C#和网络编程...
这类产品使用方便,性能稳定,性价比较高。 #### 四、实例解析 以四川德阳四星电子的SC-485C接口转换器为例,该转换器能够实现RS232/RS485/RS422之间的转换。具体制作步骤如下: 1. **准备材料**:首先准备必要的...
总的来说,“pointnet++自制室外城市区域数据集”为研究者提供了一个良好的平台,来测试和改进点云处理算法,尤其是在复杂的城市环境中。通过PointNet++这样的技术,我们能够更好地理解和利用三维点云数据,推动智慧...
JTAG(Joint Test Action Group)是一种国际标准测试协议,广泛应用于嵌入式系统,特别是微控制器的硬件调试。 首先,我们来了解AVR。AVR是Atmel公司(现已被Microchip Technology收购)开发的一系列高级RISC(精简...
首先,C#是一种面向对象的编程语言,由微软公司开发,它具有语法简洁、类型安全、性能优秀等特点,特别适合用于开发企业级应用。在财物管理系统的开发中,C#的这些特性确保了程序的稳定性和可维护性。 财物管理系统...
7. **性能测试**:提供测试Wi-Fi信号增强效果的方法,比如使用手机或电脑的Wi-Fi信号强度工具进行比较。 通过这样的项目,用户不仅可以学习到无线通信的基础知识,还能提升实践技能,亲手改善家庭或工作场所的无线...
性能测试部分包括了力学性能测试、扫描电镜(SEM)分析、介电性能测试、紫外光老化测试等。力学性能测试主要参照了相关的国家标准进行,考察了复合材料的拉伸强度、弯曲强度和模量、层间剪切强度等。SEM分析用于观察...
`test_semseg.py` 是测试脚本,用于评估模型在自制数据集上的表现。它通常会在验证集或测试集上运行,计算并报告各种指标,如平均精度(mIoU)和分类准确率。测试阶段,模型会根据学到的特征对新的点云数据进行预测...
【标题】"自制超简易电子书 电子书类源码_ios源码"涉及的主要知识点是iOS平台上的电子书开发,特别是使用源码构建一个简单的PDF阅读器应用。在这个项目中,开发者利用ZoomingPDFViewer库来实现PDF文档的查看和交互...
11. **测试与调试**:理解单元测试、集成测试的概念,学会使用Android Studio的调试工具,对应用进行性能优化。 12. **持续集成/持续部署(CI/CD)**:了解Jenkins或其他CI工具,可以自动化构建、测试和部署应用。 ...
9. **测试与调试**:在制作过程中,不断测试和调试是提高示波器性能的关键。这包括硬件功能测试、软件bug修复以及整体性能优化。 10. **社区支持**:自制USB数字示波器的社区提供了许多资源和经验分享,如GitHub上...