程序计时方法(c/c++实现)
在编写程序中常常要不断优化算法,算法的好坏无非取决于时间和空间的消耗,其中的时间消耗也是我们最关心的问题,一些算法的时耗我们是可以很轻松的大概估计的,比如多个循环的叠加。当然也有许多情况是我们难以估计的,比如复杂的递归。这时候我们就需要一个工具来帮我们计算代码段的耗时情况。
这里我就举一个简单实用的方法。
c/c++提供了名为time的标准库,其中clock()函数可以返回从程序开始到clock()函数被调用这之前CPU走过的时钟计时单元数,当然这个单元数我们是难以直接识别的,这时候我们就需要一个能表示CPU时钟一秒钟所走过的时钟单位数常量,常用的是CLOCKS_PER_SEC和CLK_TCK。
具体使用方法如下:
#include<iostream>
#include<ctime> //调用time标准库
using namespace std;
int main()
{clock_t start, end; //clock_t 是clock()的返回变量类型start = clock(); //捕捉循环段开始的时间for (int i = 0; i < 50000; i++)for (int j = 0; j < 10000; j++);end = clock(); //捕捉循环段结束的时间cout << "代码经过的时间是" << (end-start) / CLK_TCK << endl; //两端时间相减再除以常量return 0;
}
这样我们就可以了解我们的程序具体的时耗了
但是其中有几点值得注意:
- start和end应分别在被测代码段的前后,不在测试范围的代码要写在外面,如程序的准备工作。
- 计算机运行程序很快,许多代码段能瞬间被完成,当代码消耗时间小于一个时钟计时单元时,会无法正常显示耗时(输出耗时为0),这时我们可以将所测代码运行多遍,再将所得耗时除以运行次数,即可得到代码用时;或增大输入数据,来获得耗时。举个例子:
当我们想看看斐波拉契数列递归实现方法的时间耗时
#include<iostream>
#include<ctime>
using namespace std;
long long rpt(int n)
{if (n == 1 || n == 2) return 1;else return rpt(n - 1) + rpt(n - 2);
}
int main()
{clock_t start, end;start = clock();rpt(20); //对递归函数计时end = clock();cout << "代码经过的时间是" << (end-start) / CLK_TCK << endl;return 0;
}
不出所料:
没关系,我们让代码多运行几次,套个循环看看:
#include<iostream>
#include<ctime>
using namespace std;
long long rpt(int n)
{if (n == 1 || n == 2) return 1;else return rpt(n - 1) + rpt(n - 2);
}
int main()
{clock_t start, end;int i;start = clock();for(i=0;i<5000;i++) rpt(20); //多让代码运行几遍end = clock();cout << "代码经过的时间是" << (end-start) / CLK_TCK << endl;return 0;
}
这次显示是3。
然后我们再用所得时间(也就是3)除以循环的次数(5000次)就是代码的运行时间啦。
增大输入数据也可以用来返回有效耗时,如将求第20项改为求100项 求第40项,也可以看出耗时,这种方法比较适合比较两种算法的时耗情况。
程序计时方法(c/c++实现)相关推荐
- linux c++ 程序运行时间,总结UNIX/LINUX下C++程序计时的方法
前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序 ...
- linux 改成utc时间_C++下四种常用的程序运行时间的计时方法总结
记录下当前时间start,调用程序fun(),再记录一下时间end. 前后时间一减(start-end)就得到程序的运行时间了. 首先介绍最常用的,但两种精度不是很高(>=10ms)的方法:cl ...
- 汇总|C++系统计时方法以及系统时间戳获取方法
文章目录 前言 一 统计程序耗时方法 方法一(使用频率:常用) 方法二(使用频率:次之) 方法三(使用频率:常用) 补充: 方法五 二 获取系统时间戳 2.1 常用方法,非常有效 方法二 也是可以的 ...
- c纳秒级计时器_C#中的高精度计时方法(纳秒级别计时)
QueryPerformanceCounter获得CPU执行计数值 __int64 startTime if(QueryPerformanceCounter((LARGE_INTEGER *)& ...
- C++ Builder开发AutoCAD应用程序的方法
※ 编程技巧 应用实践 ※ C++ Builder开发AutoCAD应用程序的方法 周永军(水利部山西水利水电勘测设计研究院 030024) [摘要]进行AutoCAD二次开发的程序设计方法为数众多 ...
- 嵌入式程序编写方法与规范
嵌入式程序编写方法与规范 前言 本文主要讲解嵌入式单片机程序的编写方法以及编写规范,以MSP430单片机作为例子,无论是51,AVR还是STM32单片机都同样适用,本文对C语言各种语法各种关键字进行详 ...
- python程序计时_python如何计时
计时对于了解程序的性能是很关键的部分.本文讨论了Python 2和python 3中计时方法. python2和python3的通用计时方法(推荐学习:Python视频教程) 由于python2和3里 ...
- Python程序计时
# 给程序计时 实质就是获得当前时间的函数的使用 # 获得程序执行前后的两个时间 然后作差即可# 三种方法:time.time() datetime.datetime.now() time.clock ...
- linux中时间计时,Linux 中的计时方法
本文描述了Linux系统中一些与计时相关的问题和解决方法.因为在学习和研究的过程中我们经常需要统计程序或程序段的耗时,评估它们的性能好坏.因而这些问题对于我们来说,经常会遇到.掌握多种计时方法对于开发 ...
最新文章
- 通用Logging框架设计
- python到底可以做什么-编程小白必看!Python到底能做什么?
- 铁路系统的在线检测系统讲座
- 深度学习-吴恩达-笔记-4-深层神经网络
- 什么是损失函数与平均误差算法分析
- [RK3399][Android7.1] Display系统中的DRM模块介绍
- aardio Access数据库和所有表
- Java 实现MD5加密
- Python爬虫系列之全国邮编区号爬取
- 国家代码查询(Country codes)
- Rest-assured + testNG1
- 游戏手柄按键遥杆值检测
- vue2中h(“router-view“) vue3如何写?
- Lesson 56 Faster than sound! 比声音还快!
- 微软做好了放弃Flash Player的准备
- 一本看到技巧又能保持阳光心态励志书(来自苏鹏的推荐)——《程序员羊皮卷》连载(4)
- POST和Get辨析
- Java【常见问题】List如何实现排序?
- 桌面打不开计算机控制面板,电脑控制面板打不开怎么办?两种解决方法
- 42 | MySQL Grant赋权限(这篇文章可能没啥你想要的)