版权所有 © 2008 Howard Hinnant
版权所有 © 2006, 2008 Beman Dawes
版权所有 © 2009-2013 Vicente J. Botet Escriba
根据 Boost 软件许可证版本 1.0 发布。(参见随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)
目录
]
]
“那么,时间是什么?如果没人问我,我知道;如果我必须向问我的人解释,我不知道。”
-- 奥古斯丁
本文件使用以下命名和格式约定。
等宽字体
,并进行语法高亮。斜体
。()
,例如 free_function()
。class_template<>
;即,它采用代码字体,其名称后跟 <>
以表明它是一个类模板。MACRO()
;即,它采用大写代码字体,其名称后跟 ()
以表明它是一个类似函数的宏。类对象宏则不带末尾的 ()
。![]() |
注意 |
---|---|
此外,像这样的注释用于指定非必要信息,提供额外的背景或原理。 |
最后,您可以将以下内容添加到本文档中的任何代码片段中:
// Include all of Chrono files #include <boost/chrono.hpp>
我们每天都在与时间打交道。从出生起我们就本能地知道它。因此,我们都非常熟悉它,并认为它是一个简单的问题。在计算机程序中建模时间也应该同样简单。不幸的真相是,这种感知到的简单性只是表面现象。幸运的是,我们不需要一个极其复杂的解决方案来满足我们的大部分需求。然而,过于简单的解决方案可能危险且效率低下,并且无法适应计算机行业的演变。
Boost.Chrono 实现 C++11 中提出的新时间功能,如 N2661 - A Foundation to Sleep On 中所述。该文档为关键设计决策提供了背景和动机,并且是本文档中大量信息来源。
除了标准提案提供的时钟外,Boost.Chrono 还提供了特定的进程和线程时钟。
为了使 Boost.Chrono 的计时功能更具通用性,该库提供了许多对操作系统进程时间 API 进行封装的时钟,从而允许提取进程的挂钟时间、用户 CPU 时间和系统 CPU 时间。挂钟时间是 CPU 时间和系统 CPU 时间的总和。(在类 POSIX 系统上,这依赖于 times()
。在 Windows 上,则依赖于 GetProcessTimes()
。)
Boost.Chrono 库提供:
duration
类管理。时间间隔的示例包括天、minutes
、seconds
和 nanoseconds
,它们可以用每单位固定数量的时钟滴答来表示。所有这些时间间隔单位都通过 duration
工具通过通用接口统一。time_point
。 time_point
表示一个纪元加上或减去一个 duration
。该库不指定纪元。 time_point
与一个时钟关联。system_clock
、steady_clock
和 high_resolution_clock
。时钟是 time_point
和 duration
的配对,以及一个返回表示现在的 time_point
的函数。为了使计时功能更具通用性,Boost.Chrono 提供了许多对操作系统时间 API 进行封装的时钟,从而允许提取挂钟时间、用户 CPU 时间、进程花费的系统 CPU 时间。
process_real_cpu_clock
,捕获当前进程花费的挂钟 CPU 时间。process_user_cpu_clock
,捕获当前进程花费的用户 CPU 时间。process_system_cpu_clock
,捕获当前进程花费的系统 CPU 时间。process_cpu_clock
,它同时捕获进程的实际、用户 CPU 和系统 CPU 时间。thread_clock
线程稳定时钟,提供当前线程花费的时间(在平台支持的情况下)。最后,Boost.Chrono 包含 typeof 注册,用于 duration
和 time_point
,以便在 C++03 编译器中使用模拟的 auto。
它为 duration
和 time_point
提供 I/O。此 I/O 使这些类型的使用更加方便。遵循“只为所用付费”的理念,此额外功能位于一个独立于 <boost/chrono/chrono.hpp> 的头文件中,即 <boost/chrono/chrono_io.hpp>。
它建立在 <boost/ratio/ratio_io.hpp>
的基础上,为 <boost/chrono.hpp> 中的类型提供可读且灵活的格式化和解析。此文本表示使用 SI 前缀(只要可能)。这使得 boost::milliseconds
可以轻松地表示为文本“milliseconds”,或者一个假设的 meter 类可以输出“millimeter”。 duration
和 time_point
的 I/O 可以通过新的分面进行自定义:duration_units
和 time_point_units
。用户可以特化这些分面,以便 chrono I/O 可以本地化。但 Boost.Chrono 不提供完整的区域设置解决方案。
system_clock::time_point
的 I/O 以 UTC 时间点的方式提出,主要参考 ISO 9899:1999(编程语言 - C)、ISO 9945:2003(信息技术 - 可移植操作系统接口 (POSIX))和 ISO 8601:2004(数据元素和交换格式 - 信息交换 - 日期和时间表示)。
用于处理时间间隔的几个简单的舍入实用程序函数。
操作系统提供的底层时钟受许多看似任意的策略和实现不一致性的影响。这是一个委婉的说法,意思是它们往往不可靠,而且每个操作系统甚至每个时钟都有其独特的、残酷而不寻常的不可靠形式。不要把全部赌注押在它们的准确性上,除非你已经非常熟悉操作系统到底保证了什么,而通常它保证的很少。