版权所有 © 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> 之上,为 <code class="computeroutput"><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、Programming languages - C、ISO 9945:2003、Information Technology - Portable Operating System Interface (POSIX) 和 ISO 8601:2004、Data elements and interchange formats - Information interchange - Representation of dates and times。
一些用于处理时间间隔的简单四舍五入实用函数。
操作系统提供的底层时钟受到许多看似任意的策略和实现不一致性的影响。这是一种礼貌的说法,意思是它们倾向于不稳定,并且每个操作系统甚至每个时钟都有其自己残酷而不寻常的不稳定形式。不要把全部赌注押在它们的准确性上,除非你已经深入了解了特定操作系统具体保证的内容,而这通常很少。