C++_3——库(chrono)
这一系列文章的目的是在学习了C++基础后,继续补充一些C++基础和进阶的知识点,包括C++11的相关内容。
以C++11标准为基础。
C++网站:http://www.cplusplus.com/reference/
C++11引入的时间库 chrono
- chrono通过三种方式描述时间:Durations、Time points、Clocks
- Durations描述一段时间(如,10ms),由计数(count representation,即,10)和周期精度(period precision,即,ms)表示
- Time points表示一个时间点,Time points由Clock类型和相对Clock时间原点(epoch)的Durations表示
- Clocks描述计时的基准,chrono提供了三种Clock
system_clock 系统时钟,反应当前系统时间
steady_clock 单调时钟,就像秒表,记录程序运行时间,主要用来计算时间间隔Durations
high_resolution_clock 系统能够提供的最高精度下的steady_clock - 基本使用
#include <chrono>
using namespace std::chrono;
// 1 时间点
// 获取某时钟下的当前时间点
steady_clock::time_point t1 = steady_clock::now(); // 对于system_clock、high_resolution_clock也是一样的
// system_clock下,time_point与time_t表示的时间点的互相转换
system_clock::time_point today = system_clock::now();
time_t tt = system_clock::to_time_t (today);
system_clock::time_point tp = system_clock::from_time_t (tt);
// 获取某时钟下的当前时间点与时钟epoch的时间段
t1.time_since_epoch();
// 2 时间段
// 内置时间段类型
std::chrono::hours
std::chrono::minutes
std::chrono::seconds
std::chrono::microseconds
std::chrono::microseconds
std::chrono::nanoseconds
// 自定义时间段类型
std::chrono::duration<int> // 计数类型为int,默认单位是s
std::chrono::duration<int,std::milli> // 计数类型为int,单位是 ms
std::chrono::duration<int,std::ratio<60*60>> // 计数类型为int,单位是与s的比率,这里为hour
// 将时间点的差转换为时间段
std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1);
// 转换不同单位的时间段
std::chrono::hours h(1);
std::chrono::microseconds ms = std::chrono::duration_cast<std::chrono::microseconds>(h);
// 获取时间段的计数值
std::chrono::milliseconds foo (1000);
foo.count();
// 获取时长为0的时间段,并用于判断其他时间段是否为0
steady_clock::duration::zero() == foo
// 3 时间点与时间段计算:时间点可以比较大小,可以互相加减,可以加减时间段;而时间段的操作则更多...就正常使用算术运算即可
std::chrono::duration<int,std::ratio<60*60*24> > one_day (1);
system_clock::time_point tomorrow = today + one_day;
// ...
附注:C语言时间库time.h
#include <ctime>
// 返回当前程序运行时间
clock_t time = clock();
int sec = time/CLOCKS_PER_SEC; //获取对应的秒数
// 返回系统当前时间
time_t timer;
time(&timer);
// 获取两时间点之间的秒数差
time_t n1,n2;
seconds = difftime(n1,n2);
// 自定义时间点
struct tm * timeinfo;
int year, month ,day;
timeinfo = localtime ( &timer ); // 获取描述时间的结构体,并修改,完全自定义也可以
timeinfo->tm_year = year - 1900;
timeinfo->tm_mon = month - 1;
timeinfo->tm_mday = day;
mktime ( timeinfo );
// 按格式输出时间的字符串
ctime (&timer);
附注:Linux时间库
#include <sys/time.h> 是Linux系统的时间库,其中包含了C语言的time.h
#include <sys/time.h>
struct timeval time;
/* 获取时间,理论到us */
gettimeofday(&time, NULL);
printf("s: %ld, ms: %ld\n", time.tv_sec, (time.tv_sec*1000 + time.tv_usec/1000));