热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++ Boost Chrono实现计时码表流程详解【C++教程】

Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标

C++ Boost Chrono实现计时码表流程详解

一、Boost.Chrono说明

库 Boost.Chrono 提供了多种时钟。例如,您可以获取当前时间,也可以测量流程中经过的时间。

Boost.Chrono 的部分内容已添加到 C++11。如果您的开发环境支持 C++11,您可以访问头文件 chrono.xml 中定义的多个时钟。但是,C++11 不支持某些功能,例如用于测量 CPU 时间的时钟。此外,只有 Boost.Chrono 支持用户定义的时间输出格式。

二、示例代码

您可以通过头文件 boost/chrono.hpp 访问所有 Boost.Chrono 时钟。唯一的扩展是用户定义的格式,它需要头文件 boost/chrono_io.hpp。

例 37.1。来自 Boost.Chrono 的所有时钟

#include 
#include 
using namespace boost::chrono;
int main()
{
  std::cout <

Example37.1

例 37.1 介绍了 Boost.Chrono 提供的所有时钟。所有时钟都有一个共同的成员函数 now(),它返回一个时间点。所有时间点都相对于普遍有效的时间点。这个参考时间点称为纪 元。一个经常使用的纪 元是 1970 年 1 月 1 日。示例 37.1 为显示的每个时间点写入纪 元。

Boost.Chrono 包括以下时钟:

boost::chrono::system_clock 返回系统时间。这是通常显示在计算机桌面上的时间。如果您更改计算机上的时间,boost::chrono::system_clock 会返回新时间。示例 37.1 将字符串写入标准输出,如下所示:自 1970 年 1 月 1 日以来的 13919594042183544 [1/10000000] 秒。

对于 boost::chrono::system_clock,epoch 没有标准化。这些示例中使用的纪 元 1970 年 1 月 1 日取决于实现。但是,如果您特别想获取自 1970 年 1 月 1 日以来的时间,请调用 to_time_t()。 to_time_t() 是一个静态成员函数,它以 std::time_t 形式返回自 1970 年 1 月 1 日以来的当前系统时间秒数。

boost::chrono::steady_clock 是一个时钟,它总是在稍后访问时返回。即使在计算机上设置了时间, boost::chrono::steady_clock 也会返回稍后的时间。这个时间被称为单调时间。

示例 37.1 显示自系统启动以来的纳秒数。该消息如下所示:自启动以来 10594369282958 纳秒。 boost::chrono::steady_clock 测量自上次启动以来经过的时间。但是,自上次启动后开始测量是一个实现细节。参考点可能会随着不同的实现而改变。

并非所有平台都支持 boost::chrono::steady_clock。只有定义了宏 BOOST_CHRONO_HAS_CLOCK_STEADY 时,时钟才可用。

boost::chrono::high_resolution_clock 是 boost::chrono::system_clock 或 boost::chrono::steady_clock 的类型定义,具体取决于哪个时钟更精确地测量时间。因此,输出与 boost::chrono::high_resolution_clock 所基于的时钟的输出相同。

boost::chrono::process_real_cpu_clock 返回进程运行的 CPU 时间。时钟测量程序启动后的时间。示例 37.1 将一个字符串写入标准输出,如下所示:自进程启动以来的 1000000 纳秒。

您也可以使用 ctime 中的 std::clock() 获得这个时间。事实上,目前 boost::chrono::process_real_cpu_clock 的实现是基于 std::clock() 的。

只有定义了宏 BOOST_CHRONO_HAS_PROCESS_CLOCKS 才能使用 boost::chrono::process_real_cpu_clock 时钟和其他测量 CPU 时间的时钟。

boost::chrono::process_user_cpu_clock 返回进程在用户空间中花费的 CPU 时间。用户空间是指与操作系统功能分开运行的代码。在程序调用的操作系统函数中执行代码所花费的时间不计入用户空间时间。

boost::chrono::process_user_cpu_clock 只返回在用户空间运行的时间。如果程序暂停了一段时间,例如通过 Windows Sleep() 函数,则在 Sleep() 中花费的时间不会由 boost::chrono::process_user_cpu_clock 测量。

示例 37.1 将一个字符串写入标准输出,如下所示:自进程启动以来的 15600100 纳秒。

boost::chrono::process_system_cpu_clock 类似于 boost::chrono::process_user_cpu_clock。然而,这个时钟测量在内核空间中花费的时间。 boost::chrono::process_system_cpu_clock 返回进程执行操作系统函数所花费的 CPU 时间。

示例 37.1 将一个字符串写入标准输出,如下所示: 自进程启动后 0 纳秒。因为这个例子没有直接调用操作系统函数并且因为 Boost.Chrono 只使用了几个操作系统函数,所以 boost::chrono::process_system_cpu_clock 可能返回 0。

boost::chrono::process_cpu_clock 返回一个元组,其中包含 boost::chrono::process_real_cpu_clock、boost::chrono::process_user_cpu_clock 和 boost::chrono::process_system_cpu_clock 返回的 CPU 时间。示例 37.1 将字符串写入标准输出,如下所示:{1000000;15600100;0} 自进程启动后的纳秒。

boost::chrono::thread_clock 返回线程使用的时间。 boost::chrono::thread_clock 测量的时间与 CPU 时间相当,除了它是每个线程而不是每个进程。 boost::chrono::thread_clock 返回线程运行的 CPU 时间。它不区分在用户空间和内核空间中花费的时间。

并非所有平台都支持 boost::chrono::thread_clock。如果定义了宏 BOOST_CHRONO_HAS_THREAD_CLOCK,则只能使用 boost::chrono::thread_clock。

Boost.Chrono 提供宏 BOOST_CHRONO_THREAD_CLOCK_IS_STEADY 来检测 boost::chrono::thread_clock 是否像 boost::chrono::steady_clock 一样测量单调时间。

示例 37.1 将字符串写入标准输出,如下所示:自线程启动以来的 15600100 纳秒。

Boost.Chrono 中的所有时钟都依赖于操作系统功能;因此,操作系统决定了返回时间的精确度和可靠性。

例 37.2。使用 Boost.Chrono 增加和减少持续时间

#include 
#include 
using namespace boost::chrono;
int main()
{
  process_real_cpu_clock::time_point p = process_real_cpu_clock::now();
  std::cout <

now() 为所有时钟返回 boost::chrono::time_point 类型的对象。这种类型与时钟紧密耦合,因为时间点是相对于由时钟定义的参考时间点测量的。 boost::chrono::time_point 是一个模板,它需要时钟的类型作为参数。每种时钟类型都为其专门的 boost::chrono::time_point 提供类型定义。例如,process_real_cpu_clock 的类型定义是 process_real_cpu_clock::time_point。

Boost.Chrono 还提供了类 boost::chrono::duration,它描述了持续时间。因为 boost::chrono::duration 也是一个模板,所以 Boost.Chrono 提供了六个类 boost::chrono::nanoseconds, boost::chrono::milliseconds, boost::chrono::microseconds, boost::chrono::秒、boost::chrono::minutes 和 boost::chrono::hours,它们更易于使用。

Boost.Chrono 重载了几个运算符来处理时间点和持续时间。示例 37.2 从 p 中减去持续时间或将持续时间添加到 p 以获得新的时间点,这些时间点将写入标准输出。

示例 37.2 以纳秒为单位显示所有时间点。 Boost.Chrono 在处理时间点和持续时间时自动使用最小单位,以确保结果尽可能精确。如果您想将时间点与另一个单元一起使用,则必须对其进行投射。

例 37.3。使用 boost::chrono::time_point_cast() 投射时间点

#include 
#include 
using namespace boost::chrono;
int main()
{
  process_real_cpu_clock::time_point p = process_real_cpu_clock::now();
  std::cout <

(p) <<" "; }

boost::chrono::time_point_cast() 函数的使用类似于强制转换运算符。示例 37.3 使用 boost::chrono::time_point_cast() 将基于纳秒的时间点转换为以分钟为单位的时间点。在这种情况下,您必须使用 boost::chrono::time_point_cast() ,因为时间点不能以不太精确的单位(分钟)表示而不会丢失精度。您不需要 boost::chrono::time_point_cast() 从不太精确的单位转换为更精确的单位。

Boost.Chrono 还为持续时间提供强制转换运算符。

例 37.4。使用 boost::chrono::duration_cast() 投射持续时间

#include 
#include 
using namespace boost::chrono;
int main()
{
  minutes m{1};
  seconds s{35};
  std::cout <(m + s) <<"
";
}

Example37.4

示例 37.4 使用函数 boost::chrono::duration_cast() 将持续时间从秒转换为分钟。此示例将 1 分钟写入标准输出。

例 37.5。舍入持续时间

#include 
#include 
using namespace boost::chrono;
int main()
{
  std::cout <(minutes{1} + seconds{45}) <<"
";
  std::cout <(minutes{1} + seconds{15}) <<"
";
  std::cout <(minutes{1} + seconds{15}) <<"
";
}

Boost.Chrono 还提供了在施法时舍入持续时间的功能。 boost::chrono::round() 向上或向下舍入, boost::chrono::floor() 向下舍入, boost::chrono::ceil() 向上舍入。 boost::chrono::floor() 使用 boost::chrono::duration_cast() - 这两个函数之间没有区别。

示例 37.5 将 1 分钟、1 分钟和 2 分钟写入标准输出。

例 37.6。用于用户定义输出的流操纵器

#define BOOST_CHRONO_VERSION 2
#include 
#include 
#include 
using namespace boost::chrono;
int main()
{
  std::cout <

Boost.Chrono 提供了各种流操纵器来格式化时间点和持续时间的输出。例如,使用操纵器 boost::chrono::symbol_format(),时间单位被写为符号而不是名称。因此,示例 37.6 显示 10 分钟。

操纵器 boost::chrono::time_fmt() 可用于设置时区和格式字符串。时区必须设置为 boost::chrono::timezone::local 或 boost::chrono::timezone::utc。格式字符串可以使用标志来引用时间点的各种组件。例如,示例 37.6 将一个字符串写入标准输出,如下所示:15:46:44。

除了流操纵器,Boost.Chrono 还为许多不同的定制提供了方面。例如,有一个方面可以以另一种语言输出时间点。

注意

自 Boost 1.52.0 以来有两个版本的输入/输出函数。从 Boost 1.55.0 开始,默认使用较新的版本。如果您使用早于 1.55.0 的版本,则必须定义宏 BOOST_CHRONO_VERSION 并将其设置为 2 才能使示例 37.6 正常工作。

到此这篇关于C++ Boost Chrono实现计时码表流程详解的文章就介绍到这了,更多相关C++ Boost Chrono内容请搜索编程笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程笔记!


推荐阅读
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
  • 单片机入门指南:基础理论与实践
    本文介绍了单片机的基础知识及其应用。单片机是一种将微处理器(类似于CPU)、存储器(类似硬盘和内存)以及多种输入输出接口集成在一块硅片上的微型计算机系统。通过详细解析其内部结构和功能,帮助初学者快速掌握单片机的基本原理和实际操作方法。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
author-avatar
yu2531958135
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有