一、前言

在我们写程序过程中,有时候需要测试我们的程序语句执行时间的耗时,当前也是有很多的库提供我们去使用,一直没有良好的跨平台的库可以提供出来;而且一般这种代码也是由我们程序员自己调用系统的库来进行,但是往往会出现精度不足和不支持跨平台等问题;

​他来了。。。他来了。。。他踩着七彩祥云来了;“他”就是C++11中引进boost中的chrono库;他可实现高精度时钟,可以做到纳秒级;

二、chrono库

​在C++11中,是标准模板库中与时间有关的头文件。该头文件中所有函数与类模板均定义在std::chrono命名空间中;

这里主要介绍时间点和时钟两个点:

一般计时器就是从某个时间点开始,然后到某个时间点之间的计数,就是我们一般称之为耗时;

✁ 时间点:

template <class Clock, class Duration = typename Clock::duration>

  class time_point;

std::chrono::time_point 表示一个具体时间

第一个模板参数Clock用来指定所要使用的时钟,在标准库中有三种时钟,分别为:

● system_clock:当前系统范围(即对各进程都一致)的一个实时的日历时钟(wallclock)

● steady_clock:当前系统实现的一个维定时钟,该时钟的每个时间嘀嗒单位是均匀的(即长度相等)。

● high_resolution_clock:当前系统实现的一个高分辨率时钟。

第二个模板函数参数用来表示时间的计量单位(特化的std::chrono::duration<> )

时间点都有一个时间戳,即时间原点。chrono库中采用的是Unix的时间戳1970年1月1日 00:00。所以time_point也就是距离时间戳(epoch)的时间长度(duration)。

三、实践

知道了这些,我们去实现一下开始说的~

✍ 高精度计时器:

#ifndef _TimerClock_hpp_

#define _TimerClock_hpp_

#include <iostream>

#include <chrono>

using namespace std;

using namespace std::chrono;

class TimerClock

{

public:

TimerClock()

{

  update();

}

~TimerClock()

{

}

void update()

{

  _start = high_resolution_clock::now();

}

//获取秒

double getTimerSecond()

{

  return getTimerMicroSec() * 0.000001;

}

//获取毫秒

double getTimerMilliSec()

{

  return getTimerMicroSec()*0.001;

}

//获取微妙

long long getTimerMicroSec()

{

  //当前时钟减去开始时钟的count

  return duration_cast<microseconds>(high_resolution_clock::now() - _start).count();

}

private:

time_point<high_resolution_clock>_start;

};

#endif

✍ 测试:

#include "TimerClock.hpp"

int main()

{

TimerClock TC;

int sum = 0;

TC.update();

for (int i = 0; i > 100000; i++)

{

  sum++;

}

cout << "cost time:" << TC.getTimerMilliSec() <<"ms"<< endl;

cout << "cost time:" << TC.getTimerMicroSec() << "us" << endl;

return 0;

}

✍ 结果:

 

类似这种比较高精度的测试,我们可以使用在我们项目代码中进行使用,可以计算出我们程序的耗时,可以进行优化;

想了解学习更多C++方面的知识,可以关注我哦,带你学习编程,带你飞!


看到这里是不是又学到了很多新知识呢~

如果你很想学编程,小编推荐我的C语言/C++编程学习基地【点击进入】!

都是学编程小伙伴们,带你入个门还是简简单单啦,一起学习,一起加油~

还有许多学习资料和视频,相信你会喜欢的!

涉及:游戏开发、常用软件开发、编程基础知识、课程设计、黑客等等......

 

 

最新文章

  1. 《Spark 官方文档》机器学习库(MLlib)指南
  2. Java多线程系列--“基础篇”07之 线程休眠
  3. Google Zxing 二维码生成与解析
  4. ThinkPHP3.2.3扩展之生成PDF文件(MPDF)
  5. glusterFS分布式文件系统的搭建
  6. VS2010的Razor智能感知和语法高亮突然消失
  7. WPF的图片操作效果(一):RenderTransform
  8. DLL输入和输出函数—dllinport与dllexport
  9. Fix VNC Desktop Sharing on Ubuntu Desktop 14.04
  10. php框架练习
  11. NOIP模拟:饼干(简单规律推导)
  12. Navicat连接oracle数据出现的oci问题
  13. Mysql运算符与函数(胖胖老师)
  14. Linux命令大杂烩
  15. application————web
  16. 使用SAX解析xml文档
  17. 关于Nginx
  18. EL和jstl(概念和使用方法)
  19. @Valid报错 No validator could be found for constraint
  20. python---基础知识回顾(八)数据库基础操作(sqlite和mysql)

热门文章

  1. 2020重新出发,JAVA高级,JVM种设计模式
  2. WinDbg排查CPU高的问题
  3. [HDOJ1232]畅通工程(并查集)
  4. Docker端口映射及创建镜像演示(二)
  5. python的循环结构
  6. 第3章 01 python数字类型即操作
  7. Powershell编程基础-001-基本语法
  8. Oracle学习(十二)标量函数
  9. element弹框的的this.$alert、this.$prompt方法用法
  10. 国产化之路-安装达梦DM8数据库