一、前言

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

​他来了。。。他来了。。。他踩着七彩祥云来了;“他”就是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. 一文解开java中字符串编码的小秘密

    目录 简介 Unicode的发展史 Unicode详解 UTF-8 UTF-16 UTF-32 Null-terminated string 和变种UTF-8 简介 在本文中你将了解到Unicode和 ...

  2. 【GIT-精讲】从零玩转Git/GitHub/GitLab

    关于版本控制 一.什么是版本控制 版本控制(Version Control Systems)版本控制(Revision control)是一种软件工程技巧 在开发的过程中,确保由不同人所编辑的同一档案 ...

  3. iptables防火墙说明即使用

    防火墙是架设在公网和私网之间的服务器,隔离公网和私网,保护私网. RHEL7默认使用firewalld作为防火墙. 但firewalld底层还是调用包过滤防火墙iptables #systemctl ...

  4. 对比 Redis 中 RDB 和 AOF 持久化

    概念 Redis 是内存数据库,数据存储在内存中,一旦服务器进程退出,数据就丢失了,所以 Redis 需要想办法将存储在内存中的数据持久化到磁盘. Redis 提供了两种持久化功能: RDB (Red ...

  5. StringBuilder 比 String 快?空嘴白牙的,证据呢!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 聊的是八股的文,干的是搬砖的活! 面我的题开发都用不到,你为什么要问?可能这是大部分 ...

  6. apche编译安装

    常见的网页类型:htm,html,shtml,stm.php,asp,aspx,shtm,jsp等等Apache本事只处理静态页面,处理动态页面需要使用libphp5.so这个模块去工作,编译php也 ...

  7. golang slice学习

    关于获取slice相关内存地址操作 s := make([]int, 1) t.Log(unsafe.Pointer(&s))// 获取当前slice 结构体实例的内存地址 t.Log(uns ...

  8. kubernetes部署Percona XtraDB Cluster集群

    PXC介绍 全称percona-xtradb-cluster,提供了MySQL高可用的一种实现方法.PXC集群以节点组成(推荐至少3节点,便于故障恢复),每个节点都是基于常规的 MySQL Serve ...

  9. 安装Ubuntu虚拟机

    centos已经满足不了我了,这里就装了个虚拟机,等有钱了再单配台单系统的Linux主机. 一.下载Ubuntu的ISO文件 用国内的网易镜像站点 进去点个16.04.6,然后下个64位的.iso就好 ...

  10. 创建Maven项目中的几个问题

    一.用eclipse创建maven的web项目,需手动添加WEB-INF文件夹及其web.xml配置文件 二.设置编译版本1.8 在pom.xml中设置 1 <build> 2 <! ...