一、前言

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

​他来了。。。他来了。。。他踩着七彩祥云来了;“他”就是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++编程学习基地【点击进入】!

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

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

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

 

 

C++11——chrono库开发高精度计!我们可能学的不是同一门语言~的更多相关文章

  1. c++11 Chrono时间库

    c++11 Chrono时间库 http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=chrono ...

  2. C++11 std::chrono库详解

    所谓的详解只不过是参考www.cplusplus.com的说明整理了一下,因为没发现别人有详细讲解. chrono是一个time library, 源于boost,现在已经是C++标准.话说今年似乎又 ...

  3. C++11 标准库也有坑(time-chrono)

    恰巧今天调试程序遇到时间戳问题, 于是又搜了搜关于取时间戳,以及时间戳转字符串的问题, 因为 time()   只能取到秒(win和linux) 想试试看能不能找到 至少可以取到毫秒的, 于是, 就找 ...

  4. ARKit从入门到精通(11)-ARKit开发常见问题及解决方案

    转载请注明出处:ARKit从入门到精通(11)-ARKit开发常见问题及解决方案 本文主要介绍ARKit开发过程中一些常见问题 1.ARKit框架无法导入问题 2.ARKit运行黑屏或者白屏问题:Un ...

  5. 【书籍连载】《STM32 HAL 库开发实战指南—基于F7》-第一章

    从今天起,每天开始连载一章<STM32 HAL 库开发实战指南—基于F7>.欢迎各位阅读.点评.学习. 第1章  如何使用本书 1.1  本书的参考资料 本书参考资料为:<STM32 ...

  6. 漫谈C++11 Thread库之原子操作

    我在之前一篇博文<漫谈C++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程 ...

  7. C++标准库开发心得

    最近放弃MFC,改用C++标准库开发产品.毕竟MFC用熟了,马上改用STL还不太习惯.下面列出下总结的改用STL遇到的问题和解决办法: 1.清除空格 remove_if(iterBegin, iter ...

  8. Cocos开发中Visual Studio下libcurl库开发环境设置

    我们介绍一下win32中Visual Studio下libcurl库开发环境设置.Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件 ...

  9. JavaSE学习总结第11天_开发工具 & API常用对象1

      11.01 常见开发工具介绍 1:操作系统自带的记事本软件 2:高级记事本软件例:Editplus,Notepad++,UltraEdit 3:集成开发环境 IDE(Integrated Deve ...

随机推荐

  1. h5内嵌微信小程序,调用微信支付功能

    在小程序中不能使用之前在浏览器中配置的支付功能,只能调用小程序专属的api进行支付. 因为需要在现在实现的基础上,再添加在小程序中调用微信支付功能,所以我的思路是这样的 1.在点击支付按钮时,判断是不 ...

  2. 借助FreeHttp任意篡改Websocket报文(Websocket改包)

    前言 作为Web应用中最常见的数据传输协议之一的Websocket,在我们日常工作中也势必会经常使用到,而在调试或测试中我们常常也有直接改变Websocket数据报文以确认其对应用的影响的需求,本文将 ...

  3. python基础:用yagmail模块发邮件

    一.yagmail模块安装 网上下载的yagmail模块安装以后,在使用过程中,如果附件有中文,会显示乱码. pip install yagmail-0.10.212-py2.py3-none-any ...

  4. Python爬Boss,找工作,快人一步!!!

    通过职位搜索"Python开发",看下搜索的结果: https://www.zhipin.com/job_detail/?query=python开发&city=10102 ...

  5. [程序员代码面试指南]字符串问题-回文最少分割数(DP)

    问题描述 给定一个字符串,输出把它全部切成回文子串的最小分割数. 例:str="ACDCDCDAD",输出2. 解题思路 DP 存储结构 dp数组dp[len+1],dp[i]表示 ...

  6. 云计算openstack共享组件——Memcache 缓存系统(4)

    一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...

  7. python中圆周率的计算

    蒙特卡罗方法计算圆周率 蒙特卡罗方法是一个撒点方法,取一个正圆的四分之一,和一个正方形的四分之一 形成一个单位方形,单位四分之一圆和四分之一正方形之比,就构成了圆周率 向这个区域撒点,如果点落在圆内部 ...

  8. (专题一)04 matlab矩阵表示

    矩阵的建立 1. 直接输入法建立矩阵, 建立一个三行三列的矩阵 >>A=[1,2,3;4,5,6;7,8,9] 建立一个三行两列的矩阵 >>B=[1,2;4,5;7,8] 2. ...

  9. (专题一)03 matlab变量及其操作

    给内存单元取名字就可以访问内存单元 变量的命名:变量名区分大小写 标准函数名以及命名方式必须用小写字母 matlab赋值语句有两种表达式 变量的管理       1.预定义变量  ans 是默认赋值变 ...

  10. ES6 常用总结——第二章(字符串的扩展)

    ES6为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历. for (let codePoint of 'foo') { console.log(codePoint)} // &quo ...