C++11 计时器!真香

C++11 计时器!真香

1、前言

​ 在咱们写程序过程当中,有时候须要测试咱们的程序语句执行时间的耗时,当前也是有不少的库提供咱们去使用,一直没有良好的跨平台的库能够提供出来;并且通常这种代码也是由咱们程序员本身调用系统的库来进行,可是每每会出现精度不足和不支持跨平台等问题;ios

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

2、chrono库

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

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

​ 通常计时器就是从某个时间点开始,而后到某个时间点之间的计数,就是咱们通常称之为耗时;微信

时间点:函数

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)。ui

3、实践

知道了这些,咱们去实现一下开始说的高精度计时器:

#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++后台服务器方面的知识,请关注: 微信公众号:====CPP后台服务器开发====

相关文章
相关标签/搜索