首页 > 编程语言 >C++标准库:chrono

C++标准库:chrono

时间:2024-11-01 18:57:44浏览次数:1  
标签:std chrono clock C++ 标准 tag time duration

ratio

先看一下ratio的定义

template<intmax_t N,intmax_t D=1>
class ratio;

ratio是由非类型参数定义的模板,用来定义一个比率N/D,如ratio<1,-2>表示-0.5

标准库中定义的常用ratio类型

type definition 说明
ratio<1,1000> std::milli 1/1000
ratio<1,1000000> std::micro 1/1000000
ratio<1,1000000000> std::nano 1/100000000
... ... ...

duration

duration的定义

template<class Rep, class Period=ratio<1>>
class duration;

表示一个时间段,时间的单位由ratio指定,如Period=ratio<60,1>,表示60/1秒,缺省为1/1,即默认时间单位为1s

如下时间段的定义

std::chrono::duration<int> seconds(2);            // 表示2秒
std::chrono::duration<int,std::milli> ms(2);      // 表示2毫秒
std::chrono::duration<int,std::ratio<60>> min(2); // 表示2分钟

标准库中定义的常用duration类型

std::chrono::hours
std::chrono::minutes
std::chrono::seconds
std::chrono::milliseconds
std::chrono::microseconds
std::chrono::nanoseconds

成员函数count()返回Rep类型的Period的数量

std::chrono::duration<int,std::ratio<60*60*24>> one_day(2); // 2 days
one_day.count();

标准库还提供了duration_cast用于转换duration类型

template<class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep,Period>& dtn)

如下时间段的转换

// 2s
std::chrono::duration<int> seconds(2);
// s to min
auto minutes= std::chrono::duration_cast<duration<double,std::ratio<60>>>(seconds);

time_point

由时钟表示的时间点,一个time_point必须由一个 clock 计时

template<class Clock,class Duration=typename Clock::duration>
class time_point;

获取当前系统时间

// get time
std::chrono::system_clock::time_point now= std::chrono::system_clock::now();

// to time_t
std::time_t now_c= std::chrono::system_clock::to_time_t(now);
std::cout<< ctime(&now_c);

标准库还提供了time_point_cast用于指定时间单位
函数原型如下

template<class ToDuration, class Clock, class Duration>
time_point<Clock,ToDuration> time_point_cast(const time_point<Clock,Duration>& tp);

如下应用,将当前时间与纪元(Thu Jan 1 08:00:00 1970)间隔天数打印

typedef std::chrono::duration<int,std::ratio<60*60*24>> Day;

time_point<system_clock,Day> today= time_point_cast<Day>(system_clock::now());
std::cout<< today.time_since_epoch().count();

时钟

每一个时钟类中都有确定的time_pointdurationRepPeriod

system_clock

std::chrono::system_clock表示当前系统时钟

成员函数

函数名 说明
now() 获取当前时间time_point
to_time_t() time_point转换成time_t
from_time_t() time_t转换成time_point

如下示例,在当前时间上增加一天,并打印

std::chrono::duration<int,std::ratio<60*60*24>> one_day(1);
system_clock::time_point today= system_clock::now();
system_clock::time_point tomorrow= today+one_day;

std::time_t tt;
tt= system_clock::to_time_t(today);
std::cout<< ctime(&tt);

缺点:system_clock系统时钟可以修改,如网络对时,所以计时可能不准

steady_clock

该时钟不可修改,每次 tick 都保证了稳定的时间间隔

如下示例,获取程序执行时间

steady_clock::time_point t1= steady_clock::now()

/* your code */

steady_clock::time_point t2= steady_clock::now()
duration<double> time_span= duration_cast<duration<double>>(t2-t1);
std::cout<< time_span.count();

high_resolution_clock

最高精度的时钟,也是不可修改的

注:
尽量不要使用count()time_since_epoch()
标准库提供了类型安全的机制,防止用户在单位转换时出错,但是这两个函数是例外的

下面提供自定义宏来测试代码运行时间

#include <chrono>
#define TIMERSTART(tag)  auto tag##_start = std::chrono::steady_clock::now(), tag##_end=tag##_start

#define TIMEREND(tag)  tag##_end =  std::chrono::steady_clock::now()

#define DURATION_s(tag)  printf("%s costs %d s\n",#tag, std::chrono::duration_cast<std::chrono::seconds>(tag##_end-tag##_start).count())

#define DURATION_ms(tag) printf("%s costs %d ms\n",#tag, std::chrono::duration_cast<std::chrono::milliseconds>(tag##_end-tag##_start).count());

#define DURATION_us(tag) printf("%s costs %d us\n",#tag, std::chrono::duration_cast<std::chrono::microseconds>(tag##_end-tag##_start).count());

#define DURATION_ns(tag) printf("%s costs %d ns\n",#tag, std::chrono::duration_cast<std::chrono::nanoseconds>(tag##_end-tag##_start).count());

// usage:
//   TIMERSTART(for_loop);
//   for (int i = 0; i < 100000; i++) {
//       i*i;
//   }
//   TIMEREND(for_loop);
//   DURATION_ms(for_loop);

标签:std,chrono,clock,C++,标准,tag,time,duration
From: https://www.cnblogs.com/sgqmax/p/18521078

相关文章

  • C++标准库:random
    随机数生成设备随机数生成设备random_device,生成非确定性随机数,在Linux中通过读取/dev/urandom设备,Windows中使用rand_s重载了()运算符,每次调用会生成一个min()到max()之间的高质量随机数种子,若在Linux(UnixLike)下,可以使用这个生成高质量的随机数,可以理解为真随机数,windows下......
  • Chromium 中chrome.topSites扩展接口定义c++
    一、chrome.topSites使用 chrome.topSites API访问新标签页上显示的热门网站(即最常访问的网站)。不包括用户自定义的快捷方式。权限topSites您必须声明“topSites”扩展程序清单中授予使用此API的权限。{ "name":"Myextension", ... "permissions":[ ......
  • 06程序IPO模式与C++顺序结构
    一、程序IPO模式编程IPO是指输入、处理和输出(Input,Process,Output)的概念。在计算机编程中,IPO是一种常用的设计模式,用于描述程序的基本流程。具体来说,IPO指的是程序从接受输入数据开始,经过一系列处理计算,最终产生输出结果的过程。IPO模式的组成部分:-输入(Input):在这个阶段......
  • 复合结构(C++ Primer)
    复合结构(C++Primer)使用结构体和string使用结构体示例代码:#include<iostream>#include<string>usingnamespacestd;structperson{stringfn;stringsn;chargrade;intage;};intmain(){person*a=newperson;cout<<"what......
  • 【C++】——高效构建与优化二叉搜索树
    活着就意味必须要做点什么,请好好努力。——村上春树《地下》目录1、二叉搜索树BST1.1什么是二叉搜索树1.2BST的性能功能分析2、二叉搜索树的实现2.1BST框架2.2BST插入2.3BST搜索2.4BST删除2.5BST细节问题3、二叉搜索树遍历3.1中序遍历3.2前序遍历3.3......
  • sklearn当中fit_transform和transform方法的区别;数据标准化
    为什么要标准化?如何标准化?内容fit_transform和transform的区别这两个方法都用于对数据进行转换,但它们的适用场景和作用略有不同。1.fit_transform()作用:对数据执行拟合(fit)和转换(transform)操作。用法:用于训练数据,计算均值和标准差等统计量,并基于这些统计量对数据进行转......
  • UEC++中的GetClass和StaticClass函数
    GetClass()用途:GetClass() 是 UObject 类的一个实例方法,用于获取调用它的对象的类信息。返回类型:返回 UClass*,即指向调用对象的类的 UClass 对象的指针。使用场景:当你有一个 UObject 或其子类的实例,并且想要获取这个实例所属类的信息时,你会使用 GetClass()。例......
  • UEC++ UClass类
    一、UClass的定义与功能UClass是虚幻引擎中实现反射机制的关键部分,它允许引擎在运行时动态地查询和操作类的信息。每个UClass都保留了一个称作“类默认对象(ClassDefaultObject,简称CDO)”的模板对象,这个对象由类的构造函数生成,并且之后不会被修改。UClass和CDO都可以为特定对......
  • 题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++
    题目传送门:P1308[NOIP2011普及组]统计单词数-洛谷|计算机科学教育新生态https://www.luogu.com.cn/problem/P1308getline() 会清除使当次getline() 终止的换行,而cin 不会因此cin 以换行终止,之后还需要getline()的话,需要用getchar() 吞换行Linux的一些相......
  • 为什么 C++ 编译速度比 Java 慢得多
    ###为什么C++编译速度比Java慢得多在探讨为什么C++编译速度比Java慢得多时,我们可以归纳出几个核心原因:C++的编译模型更为复杂、模板元编程、宏处理以及链接时间。其中,C++的编译模型更为复杂这一点尤为突出。C++需要处理的细节更多,如模板实例化、头文件的重复包含等,这些......