C++(23): C++:STL中的时间库(std::chrono)

2024-05-15 23:28
文章标签 c++ 时间 23 std stl chrono

本文主要是介绍C++(23): C++:STL中的时间库(std::chrono),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 简述

        C++ STL库中的 chrono 是一个关于日期和时间的库,它提供了一套丰富、灵活且类型安全的API,用于测量和操作时间。chrono 库是C++11标准的一部分,它使得我们可以进行高精度的时间测量,以及执行基于时间点的算术操作。

2. chrono的主要组件

(1)时间点(Time Points)

        表示一个特定的时间点,例如“2023-07-06 12:00:00”。chrono 库提供了几种时间点类型,如 system_clock::time_point,steady_clock::time_point,high_resolution_clock::time_point 等。

(2)时间长度(Durations)

        表示一段时间,例如“5小时”,“10分钟”或“2.5秒”。chrono 库提供了多种表示时间长度的类型,例如 hours,minutes,seconds,milliseconds,microseconds 和 nanoseconds。

(3)时钟(Clocks)

        用于获取当前时间点。chrono 库中定义了几个时钟类型,包括 system_clock(表示从1970年1月1日开始的实时时钟),steady_clock(表示一个不会被调整的时钟,通常用于测量持续时间),high_resolution_clock(提供最高精度的时钟)等。

3. 定义时间点并获得时间

        std::chrono::time_point是一个模板类,可以通过该类定义基于不同时钟的时间点。

        如下,定义了一个基于system_clock的时间点。

std::chrono::time_point<std::chrono::system_clock> sys_time_tic;

        之后可以通过如下方式获得某一时间点。

sys_time_tic = std::chrono::system_clock::now();

        也可以定义一个steady_clock或high_resolution_clock的时间点,分别如下所示。

std::chrono::time_point<std::chrono::steady_clock> steady_time_tic;

std::chrono::time_point<std::chrono::high_resolution_clock> high_res_time_tic;

        获取时间点的方式也有所不同,需要依赖于各自的时钟类型。

steady_time_tic = std::chrono::steady_clock::now();

high_res_time_tic = std::chrono::high_resolution_clock::now();

4. 定义一个时间长度

        一般情况下,我们使用std::chrono::duration来定义一个时间长度。

        其原型如下所示。

template<class Rep, class Period = std::ratio<1>>  

class duration;

Rep是一个数值类型,用来表示此持续时间的长度。这可以是任何数值类型,但通常是整数类型(如 int64_t、long long 等)或浮点数类型(如 double、float)。这个类型决定了能够表示的时间精度和范围。

Period是一个表示时间单位的类型,它通常是 std::ratio 的一个特化,用来表示时间的分母和分子。例如,std::ratio<1> 表示以秒为单位,std::ratio<1, 1000> 表示以毫秒为单位。这个模板参数使得 duration 可以灵活地表示不同的时间单位。

std::chrono::duration还有很多变种,可以更方便的表示一段时间。

  1. std::chrono::hours
  2. std::chrono::minutes
  3. std::chrono::seconds
  4. std::chrono::milliseconds
  5. std::chrono::microseconds
  6. std::chrono::nanoseconds

        举例来说,std::chrono::milliseconds类似于std::chrono::duration(int64_t, std::ratio(1, 1000)),但不完全等同,因为前者是一个特化类型,还包含了额外的一些特性。

5. 计算一个时间周期

        假如我们想计算一个操作的执行时间,我们定义两个时间点,分别是sys_time_tic和sys_time_toc,那么我们就可以通过std::chrono::duration或std::chrono::duration_cast计算这一操作所花费的时间。

如下,通过std::chrono::duration计算操作所需的秒数。

std::chrono::duration<double> elapsed = sys_time_tic - sys_time_toc;

当然也可以直接的进行转换,下面两种方式是一样的。

std::chrono::milliseconds duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); 

auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);  

通过count()获取实际的时长。

std::cout << "The operation took " << duration.count() << " milliseconds." << std::endl;

这篇关于C++(23): C++:STL中的时间库(std::chrono)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/993223

相关文章

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

JavaScript时间戳与时间的转化常用方法

《JavaScript时间戳与时间的转化常用方法》在JavaScript中,时间戳(Timestamp)通常指Unix时间戳,即从1970年1月1日00:00:00UTC到某个时间点经过的毫秒数,下面... 目录1. 获取当前时间戳2. 时间戳 → 时间对象3. 时间戳php → 格式化字符串4. 时间字符

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指