Copyright © 2008 Howard Hinnant
Copyright © 2006, 2008 Beman Dawes
Copyright © 2009-2013 Vicente J. Botet Escriba
根据 Boost 软件许可协议 1.0 版发布。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制副本)
目录
]
]
“时间究竟是什么?如果没人问我,我知道;如果我必须向问我的人解释,我就不知道了。”
-- 奥古斯丁
本文档使用以下命名和格式约定。
fixed width font
字体,并进行语法高亮显示。italics
字体显示。()
,如 free_function()
中所示。class_template<>
;也就是说,它以代码字体显示,并且其名称后跟 <>
以指示它是类模板。MACRO()
;也就是说,它以代码字体大写,并且其名称后跟 ()
以指示它是类似函数的宏。类似对象的宏不带尾随的 ()
出现。![]() |
注意 |
---|---|
此外,诸如此类的注释指定了提供额外背景或原理的非必要信息。 |
最后,您可以将以下内容添加到本文档中的任何代码片段中
// Include all of Chrono files #include <boost/chrono.hpp>
我们每天都在生活中处理时间。自从出生以来,我们就凭直觉知道它。因此,我们都非常熟悉它,并认为它是一件简单的事情。在计算机程序中对时间建模也应该同样简单。不幸的是,这种感知到的简单性只是表面现象。幸运的是,我们不需要非常复杂的解决方案来满足我们的大部分需求。但是,过于简单的解决方案可能是危险且效率低下的,并且无法随着计算机行业的发展而适应。
Boost.Chrono 实现了 C++11 中的新时间工具,正如 N2661 - 赖以入眠的基础 中提出的那样。该文档提供了关键设计决策的背景和动机,并且是本文档中大量信息的来源。
除了标准提案提供的时钟外,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 包括用于 duration
和 time_point
的 typeof 注册,以允许将模拟的 auto 与 C++03 编译器一起使用。
它为 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 可以通过新的 facet 自定义:duration_units
和 time_point_units
。用户可以专门化这些 facet,以便 chrono i/o 可以本地化。但是 Boost.Chrono 不提供完整的区域设置解决方案。
system_clock::time_point
I/O 是根据 UTC 时间点提出的,强烈遵循 ISO 9899:1999,《编程语言 - C》,ISO 9945:2003,《信息技术 - 可移植操作系统接口 (POSIX)》和 ISO 8601:2004,《数据元素和交换格式 - 信息交换 - 日期和时间的表示》。
一些用于处理持续时间的简单舍入实用程序函数。
操作系统提供的底层时钟受许多看似任意的策略和实现不规则性的影响。这是一种礼貌的说法,意思是它们往往不可靠,并且每个操作系统甚至每个时钟都有其自身残酷和不寻常的不可靠形式。不要把全部赌注都押在它们的准确性上,除非您已经深入了解了特定操作系统正在保证什么,而这通常很少。