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

目录
  • 一、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 <boost/chrono.hpp>
#include <iostream>
using namespace boost::chrono;
int main()
{
  std::cout << system_clock::now() << '\n';
#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
  std::cout << steady_clock::now() << '\n';
#endif
  std::cout << high_resolution_clock::now() << '\n';
#ifdef BOOST_CHRONO_HAS_PROCESS_CLOCKS
  std::cout << process_real_cpu_clock::now() << '\n';
  std::cout << process_user_cpu_clock::now() << '\n';
  std::cout << process_system_cpu_clock::now() << '\n';
  std::cout << process_cpu_clock::now() << '\n';
#endif
#ifdef BOOST_CHRONO_HAS_THREAD_CLOCK
  std::cout << thread_clock::now() << '\n';
#endif
}

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 <boost/chrono.hpp>
#include <iostream>
using namespace boost::chrono;
int main()
{
  process_real_cpu_clock::time_point p = process_real_cpu_clock::now();
  std::cout << p << '\n';
  std::cout << p - nanoseconds{1} << '\n';
  std::cout << p + milliseconds{1} << '\n';
  std::cout << p + seconds{1} << '\n';
  std::cout << p + minutes{1} << '\n';
  std::cout << p + hours{1} << '\n';
}

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 <boost/chrono.hpp>
#include <iostream>
using namespace boost::chrono;
int main()
{
  process_real_cpu_clock::time_point p = process_real_cpu_clock::now();
  std::cout << p << '\n';
  std::cout << time_point_cast<minutes>(p) << '\n';
}

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 <boost/chrono.hpp>
#include <iostream>
using namespace boost::chrono;
int main()
{
  minutes m{1};
  seconds s{35};
  std::cout << m + s << '\n';
  std::cout << duration_cast<minutes>(m + s) << '\n';
}

Example37.4

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

例 37.5。舍入持续时间

#include <boost/chrono.hpp>
#include <iostream>
using namespace boost::chrono;
int main()
{
  std::cout << floor<minutes>(minutes{1} + seconds{45}) << '\n';
  std::cout << round<minutes>(minutes{1} + seconds{15}) << '\n';
  std::cout << ceil<minutes>(minutes{1} + seconds{15}) << '\n';
}

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 <boost/chrono.hpp>
#include <boost/chrono/chrono_io.hpp>
#include <iostream>
using namespace boost::chrono;
int main()
{
  std::cout << symbol_format << minutes{10} << '\n';
  std::cout << time_fmt(boost::chrono::timezone::local, "%H:%M:%S") <<
    system_clock::now() << '\n';
}

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ Boost weak_ptr智能指针超详细讲解

    目录 一.提要 二.特别智能指针(Special Smart Pointers) 一.提要 在 C++11 中,boost::weak_ptr是另一类智能指针,一般是用COM组件生成.调用,本文阐述这种指针的特点和用法. 二.特别智能指针(Special Smart Pointers) 到目前为止介绍的每个智能指针都可以在不同的场景中单独使用.但是,boost::weak_ptr 仅在与 boost::shared_ptr 结合使用时才有意义. boost::weak_ptr 在 boost/w

  • C++ Boost Format超详细讲解

    Boost.Format Boost.Format 提供了函数 std::printf() 的替代品. std::printf() 源自 C 标准并允许格式化数据输出.但是,它既不是类型安全的,也不是可扩展的. Boost.Format 提供了一种类型安全且可扩展的替代方案. Boost.Format 提供了一个名为 boost::format 的类,该类在 boost/format.hpp 中定义.与 std::printf() 类似,将包含用于控制格式的特殊字符的字符串传递给 boost::

  • C++ Boost Xpressive示例分析使用

    目录 一.综述 二.应用示例 2.1 示例 9.1 2.2 示例 9.2 2.3 示例 9.3 2.4 示例 9.4 一.综述 与 Boost.Regex 一样,Boost.Xpressive 提供了使用正则表达式搜索字符串的函数.然而,Boost.Xpressive 使得将正则表达式写成 C++ 代码而不是字符串成为可能.这使得在编译时检查正则表达式是否有效成为可能. 只有 Boost.Regex 被合并到 C++11 中.标准库不支持将正则表达式编写为 C++ 代码. boost/xpres

  • C++ Boost ScopeExit超详细讲解

    目录 一.提要 二.退出作用域(Boost.ScopeExit) 2.1 范例1.UsingBOOST_SCOPE_EXIT 2.2 示例2.Boost.ScopeExit和C++11的lambda函数 2.3 示例3.特点BOOST_SCOPE_EXIT 三.练习 一.提要 资源有很多种,每种都封装一套,还是挺繁琐的!对于比较少使用或者一个程序很可能只会用一次的资源,我们不想封装,在这种情况下用Boost.ScopeExit. 二.退出作用域(Boost.ScopeExit) 库 Boost.

  • C++ Boost实现数字与字符串转化详解

    目录 一.引言 二.Boost.LexicalCast 2.1 示例1 2.2 示例2 三.lexical_cast与c/c++提供类似接口的比较 3.1 两者比较 3.2 样例 一.引言 在boost库中,有一个函数Boost.LexicalCast可以将数字和字符串进行双向转换.本文介绍这种用法的案例. 二.Boost.LexicalCast Boost.LexicalCast 提供了一个转换运算符,boost::lexical_cast,它可以将数字从字符串转换为数字类型,例如 int 或

  • C++ Boost shared_ptr共享指针详细讲解

    目录 一.提要 二.智能指针boost::shared_ptr与boost::scoped_ptr 三.智能指针 boost::shared_ptr用法 示例1 示例2 示例3 示例4 示例5 一.提要 boost::shared_ptr是另一个智能指针,与 boost::scoped_ptr有很大不同,本文阐述这种区别. 二.智能指针boost::shared_ptr与boost::scoped_ptr 主要区别在于: boost::shared_ptr 不一定是对象的独占所有者. 所有权可以

  • C++ Boost StringAlgorithms超详细讲解

    目录 一.提要 二.简化字符串处理的工具和其库 三.应用Boost.StringAlgrithms库 3.1 字符大小写 3.2 删除字符串内子串 3.3 查找字符串内子串 3.4 合并字符串 3.5 子串替换 3.6 字符串修剪 3.7 创立谓词 3.8 比较 3.9 拆分字符串 3.10 查找字符串 练习 一.提要 boost C++对应的字符串对象也有一套标准操作方法.本文介绍库Boost.StringAlgorithms的若干函数和功能示例. 二.简化字符串处理的工具和其库 Boost.

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

    目录 一.Boost.Chrono说明 二.示例代码 一.Boost.Chrono说明 库 Boost.Chrono 提供了多种时钟.例如,您可以获取当前时间,也可以测量流程中经过的时间. Boost.Chrono 的部分内容已添加到 C++11.如果您的开发环境支持 C++11,您可以访问头文件 chrono.xml 中定义的多个时钟.但是,C++11 不支持某些功能,例如用于测量 CPU 时间的时钟.此外,只有 Boost.Chrono 支持用户定义的时间输出格式. 二.示例代码 您可以通过

  • Redis Sentinel服务配置流程(详解)

    1.Redis Sentinel服务配置 1.1简介 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常. 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过API 向管理员或者其他应用程序发送通知. 自动故障迁移(Automatic failover): 当一个主服务器不

  • 浅谈Python生成器generator之next和send的运行流程(详解)

    对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数. 然后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,然后重新运行到yield语句,执行后,跳出生成器函数,后面再次调用next,依次类推. 下面是一个列子: def consumer(): r = 'here' for i in xrange(3): yield r r = '200 OK'+ str(i)

  • java存储以及java对象创建的流程(详解)

    java存储: 1)寄存器:这是最快的存储区,位于处理器的内部.但是寄存器的数量有限,所以寄存器根据需求进行分配.我们不能直接进行操作. 2)堆栈:位于通用RAM中,可以通过堆栈指针从处理器那里获取直接支持.堆栈指针往下移动,则分配新的内存.网上移动,则释放内存.但是 在创建程序的时候必须知道存储在堆栈中的所有项的具体生命周期,以便上下的移动指针.一般存储基本类型和java对象引用. 3)堆:位于通用RAM中,存放所有的java对象,不需要知道具体的生命周期. 4)常量存储:常量值通常直接存放在

  • Android Bluetooth蓝牙技术使用流程详解

    在上篇文章给大家介绍了Android Bluetooth蓝牙技术初体验相关内容,感兴趣的朋友可以点击了解详情. 一:蓝牙设备之间的通信主要包括了四个步骤 设置蓝牙设备 寻找局域网内可能或者匹配的设备 连接设备 设备之间的数据传输 二:具体编程实现 1. 启动蓝牙功能 首先通过调用静态方法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,如果返回为空,则无法继续执行了.例如: BluetoothAdapter mBluetoothAdapter = Blueto

  • MVC+DAO设计模式下的设计流程详解

    DAO设计 : DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置. 在该层主要完成对象-关系映射的建立,通过这个映射,再通过访问业务对象即可实现对数据库的访问,使得开发中不必再用SQL语句编写复杂的

  • 微信小程序支付及退款流程详解

    首先说明一下,微信小程序支付的主要逻辑集中在后端,前端只需携带支付所需的数据请求后端接口然后根据返回结果做相应成功失败处理即可.我在后端使用的是php,当然在这篇博客里我不打算贴一堆代码来说明支付的具体实现,而主要会侧重于整个支付的流程和一些细节方面的东西.所以使用其他后端语言的朋友有需要也是可以看一下的.很多时候开发的需求和相应问题的解决真的要跳出语言语法层面,去从系统和流程的角度考虑.好的,也不说什么废话了.进入正题. 一. 支付 支付主要分为几个步骤: 前端携带支付需要的数据(商品id,购

  • Java代码生成器的制作流程详解

    1. 前言 前几天写了篇关于Mybatis Plus代码生成器的文章,不少同学私下问我这个代码生成器是如何运作的,为什么要用到一些模板引擎,所以今天来说明下代码生成器的流程. 2. 代码生成器的使用场景 我们在编码中存在很多样板代码,格式较为固定,结构随着项目的迭代也比较稳定,而且数量巨大,这种代码写多了也没有什么技术含量,在这种情况下代码生成器可以有效提高我们的效率,其它情况并不适于使用代码生成器. 3. 代码生成器的制作流程 首先我们要制作模板,把样板代码的固定格式抽出来.然后把动态属性绑定

  • C++ boost库的安装过程详解

    Windows安装boost库 下载链接:https://www.boost.org/ 学习链接:https://theboostcpplibraries.com/ 1,下载解压,我的目录"C:\Program Files (x86)\Microsoft Visual Studio\2017" 2,以管理员身份运行"适用于 VS 2017 的 x64 本机工具命令提示" 3,执行以下命令进行编译: cd /d "C:\Program Files (x86)

  • IDEA社区版下载安装流程详解(小白篇)

    本人一直使用的是Eclipse作为开发工具的,不过现在IDEA非常的受推崇,所以决定上手试一试.网上有很多旗舰版的文章,我没有仔细看,我这次是决定使用社区版的IDEA,虽然功能会少一些,作为练手用完全够用了. IDEA官网地址:https://www.jetbrains.com/idea/download/ 下载社区版后,点击安装,就进行傻瓜式的安装了. 以上两个步骤中有一个点击next的时候时间会稍稍有点久,耐心等待一下就好了. 点击安装,IDEA社区版就安装完成了,安装好之后打开IDEA工具

随机推荐