在编写程序中常常要不断优化算法,算法的好坏无非取决于时间和空间的消耗,其中的时间消耗也是我们最关心的问题,一些算法的时耗我们是可以很轻松的大概估计的,比如多个循环的叠加。当然也有许多情况是我们难以估计的,比如复杂的递归。这时候我们就需要一个工具来帮我们计算代码段的耗时情况。

这里我就举一个简单实用的方法。

c/c++提供了名为time的标准库,其中clock()函数可以返回从程序开始到clock()函数被调用这之前CPU走过的时钟计时单元数,当然这个单元数我们是难以直接识别的,这时候我们就需要一个能表示CPU时钟一秒钟所走过的时钟单位数常量,常用的是CLOCKS_PER_SECCLK_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;
}

这样我们就可以了解我们的程序具体的时耗了

但是其中有几点值得注意

  1. start和end应分别在被测代码段的前后,不在测试范围的代码要写在外面,如程序的准备工作。
  2. 计算机运行程序很快,许多代码段能瞬间被完成,当代码消耗时间小于一个时钟计时单元时,会无法正常显示耗时(输出耗时为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++实现)相关推荐

  1. linux c++ 程序运行时间,总结UNIX/LINUX下C++程序计时的方法

    前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序 ...

  2. linux 改成utc时间_C++下四种常用的程序运行时间的计时方法总结

    记录下当前时间start,调用程序fun(),再记录一下时间end. 前后时间一减(start-end)就得到程序的运行时间了. 首先介绍最常用的,但两种精度不是很高(>=10ms)的方法:cl ...

  3. 汇总|C++系统计时方法以及系统时间戳获取方法

    文章目录 前言 一 统计程序耗时方法 方法一(使用频率:常用) 方法二(使用频率:次之) 方法三(使用频率:常用) 补充: 方法五 二 获取系统时间戳 2.1 常用方法,非常有效 方法二 也是可以的 ...

  4. c纳秒级计时器_C#中的高精度计时方法(纳秒级别计时)

    QueryPerformanceCounter获得CPU执行计数值 __int64 startTime if(QueryPerformanceCounter((LARGE_INTEGER *)& ...

  5. C++ Builder开发AutoCAD应用程序的方法

    ※ 编程技巧 应用实践 ※ C++ Builder开发AutoCAD应用程序的方法 周永军(水利部山西水利水电勘测设计研究院  030024) [摘要]进行AutoCAD二次开发的程序设计方法为数众多 ...

  6. 嵌入式程序编写方法与规范

    嵌入式程序编写方法与规范 前言 本文主要讲解嵌入式单片机程序的编写方法以及编写规范,以MSP430单片机作为例子,无论是51,AVR还是STM32单片机都同样适用,本文对C语言各种语法各种关键字进行详 ...

  7. python程序计时_python如何计时

    计时对于了解程序的性能是很关键的部分.本文讨论了Python 2和python 3中计时方法. python2和python3的通用计时方法(推荐学习:Python视频教程) 由于python2和3里 ...

  8. Python程序计时

    # 给程序计时 实质就是获得当前时间的函数的使用 # 获得程序执行前后的两个时间 然后作差即可# 三种方法:time.time() datetime.datetime.now() time.clock ...

  9. linux中时间计时,Linux 中的计时方法

    本文描述了Linux系统中一些与计时相关的问题和解决方法.因为在学习和研究的过程中我们经常需要统计程序或程序段的耗时,评估它们的性能好坏.因而这些问题对于我们来说,经常会遇到.掌握多种计时方法对于开发 ...

最新文章

  1. 通用Logging框架设计
  2. python到底可以做什么-编程小白必看!Python到底能做什么?
  3. 铁路系统的在线检测系统讲座
  4. 深度学习-吴恩达-笔记-4-深层神经网络
  5. 什么是损失函数与平均误差算法分析
  6. [RK3399][Android7.1] Display系统中的DRM模块介绍
  7. aardio Access数据库和所有表
  8. Java 实现MD5加密
  9. Python爬虫系列之全国邮编区号爬取
  10. 国家代码查询(Country codes)
  11. Rest-assured + testNG1
  12. 游戏手柄按键遥杆值检测
  13. vue2中h(“router-view“) vue3如何写?
  14. Lesson 56 Faster than sound! 比声音还快!
  15. 微软做好了放弃Flash Player的准备
  16. 一本看到技巧又能保持阳光心态励志书(来自苏鹏的推荐)——《程序员羊皮卷》连载(4)
  17. POST和Get辨析
  18. Java【常见问题】List如何实现排序?
  19. 桌面打不开计算机控制面板,电脑控制面板打不开怎么办?两种解决方法
  20. 42 | MySQL Grant赋权限(这篇文章可能没啥你想要的)

热门文章

  1. Linux-每日 指令 -ls(一)
  2. html网页让字体浮动的颜色,HTML/CSS从零开始-常用属性(三)(示例代码)
  3. 一键过滤选择百度网盘文件
  4. “项目冲刺”博客——第二篇
  5. 可拆卸智能安全帽之创新极品~智能帽衬
  6. 01. Ubuntu下安装nvidia显卡驱动(安装方式简单)
  7. Beyond,一次迟到的告别
  8. PDF转换图片小工具(高清、无水印、支持随意页数)
  9. 不同k值对KNN算法预测准确率的影响
  10. 《TCP IP 详解卷1:协议》阅读笔记 - 第十章