C++学习记录:基于chrono库的高精度计时器

  C++11中新引入了std::chrono库,由此可以较为容易的实现一个计时器。同时,休眠操作也可以通过这个库来实现,从而使代码有良好的跨平台性,避免使用Windows/Linux的系统休眠函数。
  在接下来的网络编程学习中,将引入该计时器,实现对每秒收包、连接等数据的计数显示。
  本篇学习记录使用的语言为C++,调用的库为C++11里的std::chrono库。

一、简易的计时器类

mytimer.hpp代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ifndef MY_TIMER_H_
#define MY_TIMER_H_

#include<chrono>

class mytimer
{
private:
std::chrono::steady_clock::time_point _begin;//起始时间
std::chrono::steady_clock::time_point _end;//终止时间
public:
mytimer()
{
_begin = std::chrono::steady_clock::time_point();
_end = std::chrono::steady_clock::time_point();
}

virtual ~mytimer(){};

//调用update时,使起始时间等于当前时间
void UpDate()
{
_begin = std::chrono::steady_clock::now();
}

//调用getsecond方法时,经过的时间为当前时间减去之前统计过的起始时间。
double GetSecond()
{
_end = std::chrono::steady_clock::now();
//使用duration类型变量进行时间的储存 duration_cast是类型转换方法
std::chrono::duration<double> temp = std::chrono::duration_cast<std::chrono::duration<double>>(_end - _begin);
return temp.count();//count() 获取当前时间的计数数量
}
};

#endif

测试该计时器的代码示例 main.cpp 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include"mytimer.hpp"
#include<iostream>

int main()
{
mytimer _time;
_time.UpDate();
for(int n=0;n<100000000;n++)
{

}
std::cout<<_time.GetSecond();
return 0;
}

二、基于chrono库的休眠

使用方法如下:

1
2
std::chrono::milliseconds t(1);//休眠一毫秒 
std::this_thread::sleep_for(t);