c++11 时间模板库chrono

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1.概述

C++11引入了库,它提供了一组用于处理时间间隔和时间点的实用工具。该库旨在提供一种类型安全且全面的方式来处理与时间相关的操作。

2.主要关键组件

std::ratio:表示的是时间单位,例如std::ratio<1,1>表示1s,std::ratio<60,1>表示1min
std::chrono::duration:表示时间长度,可以表示一天,一个月,一年等等
std::chrono::time_point:表示时间点,定义为自纪元(1900.1.1 00:00:00)以来的持续时间
std::chrono::system_clock:表示系统范围的实时挂钟
std::chrono::steady_clock:一个不受系统时钟调整影响的单调时钟。用于测量时间间隔
std::chrono::duration_cast:在不同的持续时间类型之间进行转换
std::chrono::time_point_cast:在不同的时间点类型之间进行转换

细则

std::ratio

模板定义 template<intmax_t _Nx, intmax_t _Dx = 1> struct ratio;
ratio表示时间单位,它表示的是以Nx/Dx的值表示最小刻度的单位。
ratio<1,1> 表示以1s为最小单位
ratio<60,1> 表示以1min为最小单位
ratio<6060,1> 表示以1h为最小单位
ratio<1,1000> 表示以1毫秒为最小单位
ratio<1,1000
1000> 表示以1微秒为最小单位
ratio<1,100010001000> 表示以1纳秒为最小单位

std::chrono::duration

模板定义

template<class _Rep,
	class _Period>
	class duration
	{	// represents a time duration
public:
	using rep = _Rep;
	using period = typename _Period::type;

	static_assert(!_Is_duration_v<_Rep>,
		"duration can't have duration as first template argument");
	static_assert(_Is_ratio_v<_Period>,
		"period not an instance of std::ratio");
	static_assert(0 < _Period::num,
		"period negative or zero");
		.......

_Rep为数值类型_Period为ratio类型,主要表示的是一段时间距离。
直接看例子 分别表示1s、1min、 1h、1day等的不同方式

	//分别表示1s、1min、 1h、1day的不同方式
	std::chrono::duration<int, std::ratio<1, 1>>				du_s(1);//最小单位为1秒
	std::chrono::duration<int, std::ratio<60, 1>>				du_m(1);//最小单位为1min
	std::chrono::duration<int, std::ratio<60*60, 1>>			du_h(1);//最小单位为h
	std::chrono::duration<int, std::ratio<60*60*24, 1>>			du_d(1);//最小单位为day
	//分别表示1毫秒、1微秒、1纳秒
	std::chrono::duration<int, std::ratio<1, 1000>>				du_mi(1);//最小单位为1毫秒
	std::chrono::duration<int, std::ratio<1, 1000000>>			du_mc(1);//最小单位为1微秒
	std::chrono::duration<int, std::ratio<1, 1000000000>>		du_no(1);//最小单位为1纳秒
	//duration还提供了对应的接口函数++ -- *=value 不过这些都是以最小单位为1刻度进行相加时间 例如
	du_s * 3;	//表示3秒
	du_s ++;	//表示2秒

	du_m * 5;		//表示5天
	du_m * 3 * 5;	//表示15天
	//相同类型的duration可以直接相加减不同类型的需要借助std::chrono::duration_cast进行转换成相同类型后再相加
	
	//相同类型
	std::chrono::duration<int, std::ratio<60 * 60 * 24, 1>>			du_d2(5);
	du_d + du_d2; //6day
	//不同类型
	//(du_d += du_s; //会报错)
	//会先将du_s转换成最小单位为day的类型 然后再相加
	//因为是小单位转换成大单位所以精度会丢失 既相加后还是1天
	du_d += std::chrono::duration_cast<std::chrono::duration<int, std::ratio<60 * 60 * 24, 1>>>(du_s); 

std::chrono::time_point

表示某一个时间点 直接看源码

template<class _Clock,
	class _Duration = typename _Clock::duration>
	class time_point
	{	// represents a point in time
public:
	using clock = _Clock;
	using duration = _Duration;
	using rep = typename _Duration::rep;
	using period = typename _Duration::period;

	static_assert(_Is_duration_v<_Duration>,
		"duration must be an instance of std::duration");

	constexpr time_point() = default;

	constexpr explicit time_point(const _Duration& _Other)
		: _MyDur(_Other)
		{	// construct from a duration
		}

	template<class _Duration2,
		class = enable_if_t<is_convertible_v<_Duration2, _Duration>>>
		constexpr time_point(const time_point<_Clock, _Duration2>& _Tp)
		: _MyDur(_Tp.time_since_epoch())
		{	// construct from another duration
		}

	_NODISCARD constexpr _Duration time_since_epoch() const
		{	// get duration from epoch
		return (_MyDur);
		}

	_CONSTEXPR17 time_point& operator+=(const _Duration& _Dur)
		{	// increment by duration
		_MyDur += _Dur;
		return (*this);
		}

	_CONSTEXPR17 time_point& operator-=(const _Duration& _Dur)
		{	// decrement by duration
		_MyDur -= _Dur;
		return (*this);
		}

	_NODISCARD static constexpr time_point (min)() noexcept // Strengthened, P0972
		{	// get minimum time point
		return (time_point((_Duration::min)()));
		}

	_NODISCARD static constexpr time_point (max)() noexcept // Strengthened, P0972
		{	// get maximum time point
		return (time_point((_Duration::max)()));
		}

private:
	_Duration _MyDur{duration::zero()};	// duration since the epoch
	};
}	// namespace chrono

源码内容十分简单 模板类会接收一个Clock模板从Clock模板中获取_Duration,也就是说time_point的最小单位取决于
Clock中的_Duration中的ratio。
与此同时还提供了±=(const _Duration& _Dur)接口用来计算下一时刻、下一段距离后的时刻点
其中提供了time_since_epoch返回内部的_Duration。

clock

上一个类中用到的clock分别有三种类型:system_clock、steady_clock、high_resolution_clock

system_clock

表示系统范围的实时挂钟,也就是电脑时间
上源码

struct system_clock
	{	// wraps GetSystemTimePreciseAsFileTime/GetSystemTimeAsFileTime
	using rep = long long;

	using period = ratio_multiply<ratio<_XTIME_NSECS_PER_TICK, 1>, nano>;

	using duration = chrono::duration<rep, period>;
	using time_point = chrono::time_point<system_clock>;
	static constexpr bool is_steady = false;

	_NODISCARD static time_point now() noexcept
		{	// get current time
		return (time_point(duration(_Xtime_get_ticks())));
		}

	_NODISCARD static __time64_t to_time_t(const time_point& _Time) noexcept
		{	// convert to __time64_t
		return ((__time64_t)(_Time.time_since_epoch().count()
			/ _XTIME_TICKS_PER_TIME_T));
		}

	_NODISCARD static time_point from_time_t(__time64_t _Tm) noexcept
		{	// convert from __time64_t
		return (time_point(duration(_Tm * _XTIME_TICKS_PER_TIME_T)));
		}
	};

从源码中可以看出system_clock的单位主要是以std::ratio<100,nano>为最小单位。
其中static time_point now()获取的是当前的时间点(从纪元开始算起1900年)。
还提供了两个函数to_time_t和from_time_t分别实现time_point到秒级别的转换。
to_time_t从代码上看
_Time.time_since_epoch().count()表示的是n / std::ratio<100,nano>,其中n是多少秒
例如10s的count为 10 / 100/1000000000 = 100000000
而#define _XTIME_TICKS_PER_TIME_T 10000000LL
则count/_XTIME_TICKS_PER_TIME_T =10s

steady_clock

一个不受系统时钟调整影响的单调时钟。用于测量时间间隔

struct steady_clock
	{	// wraps QueryPerformanceCounter
	using rep = long long;
	using period = nano;
	using duration = nanoseconds;
	using time_point = chrono::time_point<steady_clock>;
	static constexpr bool is_steady = true;

	_NODISCARD static time_point now() noexcept
		{	// get current time
		const long long _Freq = _Query_perf_frequency();	// doesn't change after system boot
		const long long _Ctr = _Query_perf_counter();
		static_assert(period::num == 1, "This assumes period::num == 1.");
		const long long _Whole = (_Ctr / _Freq) * period::den;
		const long long _Part = (_Ctr % _Freq) * period::den / _Freq;
		return (time_point(duration(_Whole + _Part)));
		}
	};

using high_resolution_clock = steady_clock;
}	// namespace chrono

steady_clock只是用来测量时间间隔的类,简单写个了例子。

	std::chrono::time_point p1 = std::chrono::steady_clock::now();
	int s = 0;
	for (int i = 0; i < 2000000010; i++)
	{
		s += i;
	}
	std::chrono::time_point p2 = std::chrono::steady_clock::now();

	std::chrono::duration<int, std::ratio<1>> seconde = std::chrono::duration_cast<std::chrono::duration<int, std::ratio<1>>>(p2.time_since_epoch() - p1.time_since_epoch());
	std::cout << "seconde: " << seconde.count();

high_resolution_clock

c++11中的high_resolution_clock 和steady_clock一致
即uing high_resolution_clock = steady_clock;

工作中可能会用到当前日期

	//获取自1900.1.1 00:00:00到当前的时间点
	std::chrono::time_point point =  std::chrono::system_clock::now();
	//获取自1900.1.1 00:00:00到当前的秒
	time_t secondes = std::chrono::system_clock::to_time_t(point);
	std::tm* t =  std::localtime(&secondes);

	std::cout << t->tm_year + 1900 << " " << t->tm_mon + 1 << " " << t->tm_mday<<" ";
	std::cout << t->tm_hour << ":" << t->tm_min<< ":" << t->tm_sec;
C++11计时器:chrono库介绍 阅读详情

相关推荐

C++基础】chrono

chronoC++ 标准库中的一个头文件,提供了处理日期、时间、时钟等时间相关操作的功能。它在 C++11 标准中引入,提供了更方便、更强大的时间处理功能。1.1: 代表时间段,可以表示一段时间的长度,以不同的时间单位表示,例如秒、毫秒、微秒等。: 代表时间点,它是相对于某个时间点的持续时间。: 提供了当前的系统时间,可以用来获取当前时间点。: 与类似,但提供的时间点递增稳定,不受系统时间调整的影响。: 提供了最高精度的时钟,通常基于实现。

2201_75772333的博客 1276

再也不被时间束缚:C++ stdchrono时间库全面解析

这是一篇介绍C++ std::chrono时间库的全面文章。在现代软件开发中,时间处理是一个重要的部分,而std::chrono时间库提供了丰富的功能和灵活的接口来处理时间相关的操作,使得开发者能够更好地控制和管理时间。 本文首先介绍了std::chrono时间库的核心概念,包括时钟、时间点和时间间隔。其中,时钟作为时间的源头,提供了基准和刻度;时间点表示特定时钟上的一个时间时间间隔表示一段时间的表示。

Lion_Long的博客 1858

C++11——chrono库开发高精度计!我们可能学的不是同一门语言~

一、前言 在我们写程序过程中,有时候需要测试我们的程序语句执行时间的耗时,当前也是有很多的库提供我们去使用,一直没有良好的跨平台的库可以提供出来;而且一般这种代码也是由我们程序员自己调用系统的库来进行,但是往往会出现精度不足和不支持跨平台等问题; ​他来了。。。他来了。。。他踩着七彩祥云来了;“他”就是C++11中引进boost中的chrono库;他可实现高精度时钟,可以做到纳秒级; 二、chrono库 ​在C++11中,是标准模板库中与时间有关的头文件。该头文件中所有函数与类模板均定义在st.

HUYA69的博客 416

C++11 时间编程(1)std::chrono模板介绍

要使用chrono库,需要#include,其所有实现均在std::chrono namespace下。注意标准库里面的每个命名空间代表了一个独立的概念。 chrono是一个模版库,使用简单,功能强大,只需要理解三个概念:duration、time_point、clock 一 、时钟-CLOCK chrono库定义了三种不同的时钟: std::chrono::system_clock: 依据系统的当前时间 (不稳定) std::chrono::steady_clock: 以统一的速率运行(不能被调整

二进制君 9612

c++11 chrono全面解析(最高可达纳秒级别的精度)

chronoc++ 11中的时间库,提供计时,时间等功能。 学习chrono,关键是理解里面时间段(Durations)、时间点(Time points)的概念。 1.基础: 时间节拍:

帝江VII的博客 2万+

C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)

C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1万+

c++11知识点3_chrono时间模板库

1.概述 chrono是一个time library, 源于boost,现在已经是C++11标准。 要使用chrono库,需要#include,其所有实现均在std::chrono namespace下。 chrono是一个模版库,使用简单,功能强大,只需要理解三个概念:duration、time_point、clock 2.Durations std::chrono::dura

haibo19981的专栏 3234

C++11>chrono,call_once,= delete

C++11::<chrono>

qq_42069216的博客 174

利用c++11 chrono库记录时间

C++11中,是标准模板库中与时间有关的头文件。该头文件中所有函数与类模板均定义在std::chrono命名空间中。当我们想要记录模块代码或者函数的运算耗时的时候,可以利用chrono库实。相关的代码如下: #include <chrono> #include <iostream> class Timer { public: Timer(); virtual ~Timer(); int elapsedSecond(); int elapsedMil

u012836279的专栏 541

C++11中头文件chrono的使用

C++11中,<chrono>是标准模板库中与时间有关的头文件。该头文件中所有函数与类模板均定义在std::chrono命名空间中。 std::chrono是在C++11中引入的,是一个模板库,用来处理时间和日期的Time library。要使用chrono库,需要include<chrono>,其所有实现均在chrono命名空间下。 std::chrono::dur...

网络资源是无限的 1万+

c纳秒级计时器_C++11 计时器!真香

C++11 计时器!真香一、前言​ 在我们写程序过程中,有时候需要测试我们的程序语句执行时间的耗时,当前也是有很多的库提供我们去使用,一直没有良好的跨平台的库可以提供出来;而且一般这种代码也是由我们程序员自己调用系统的库来进行,但是往往会出现精度不足和不支持跨平台等问题;​ 他来了。。。他来了。。,他踩着七彩祥云来了;“他”就是C++11中引进boost中的chrono库;他可实现高精度时钟,...

weixin_34467247的博客 1426

C/C++编程笔记:C++计时器讲解!详细知识点带你学会

一、前言 ​ 在我们写程序过程中,有时候需要测试我们的程序语句执行时间的耗时,当前也是有很多的库提供我们去使用,一直没有良好的跨平台的库可以提供出来;而且一般这种代码也是由我们程序员自己调用系统的库来进行,但是往往会出现精度不足和不支持跨平台等问题; ​他来了。。。他来了。。,他踩着七彩祥云来了;“他”就是C++11中引进boost中的chrono库;他可实现高精度时钟,可以做到纳秒级; 二、chrono库 ​在C++11中,是标准模板库中与时间有关的头文件。该头文件中所有函数与类模板均定义在s

致力于C语言C++知识分享! 557

c++ 常用头文件

1.#include<iostream> iostream 的意思是输入输出流。#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头文件。 2.#include<fsteram>fstream是C++ STL中对文件操作的合集,包含了常用的所有文件操作。其中包含basic_ifstream,basi...

weixin_30289831的博客 306

C++11版本后的一写新语法及使用方法for、vector、map

1、STL算法里的find和find_if算法的使用: 区别于联系:联系:这个两个函数都是查找某个元素位置的方式;区别:其中find值适用于查找其里面元素值的位置。而find_if值使用与函数第三个参数的为判别式时的使用。 template&lt;class InputIterator, class T&gt; InputIterator find ( InputIterator first...

yangdeshun888的博客 3993

嵌入式模板库CMake集成方案:解决嵌入式C++项目内存确定性需求

在资源受限的嵌入式系统中,动态内存分配往往是不可接受的。嵌入式模板库(ETL)为C++开发者提供了一套完全避免堆内存使用的容器和算法解决方案。本文将深入探讨ETL的核心价值,并提供三种实用的CMake集成方法,帮助开发者根据项目需求选择最适合的构建方案。 ## 嵌入式C++开发的内存确定性挑战 传统C++标准库(STL)在嵌入式环境中面临诸多限制:动态内存分配导致内存碎片化、运行时行为不确定性

gitblog_01069的博客 356

Windows C++ OpenVINO部署YOLOv11实例分割:从模型导出到工程实战

模型部署是计算机视觉应用落地的关键环节,其核心在于将训练好的深度学习模型高效、稳定地集成到目标硬件和软件环境中。OpenVINO作为英特尔推出的高性能推理工具套件,通过中间表示(IR)格式和硬件抽象层,实现了模型在不同计算设备(如CPU、GPU)上的优化执行,显著提升了推理速度并降低了资源消耗。这一技术对于工业质检、自动驾驶、安防监控等实时性要求高的场景具有重要价值。本文聚焦于YOLOv11实例分割模型在Windows平台上的C++部署实战,针对其引入的LetterBox预处理这一关键变化,详细解析了从环境

504

C++标准库:STL以及输入输出库,IO库,Cmath库,时间库,智能指针库与并发库等简介

c++标准库 STL cmath chrono iostream thread mutex condition_variablecondition_variable

追赶时代的博客 2269
上一篇: 结构型设计模式
何法霖
博客等级 码龄7年 64粉丝 7原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值