定义于头文件 <chrono>
std::chrono
库
chrono
库定义三种主要类型以及工具函数和常用 typedef 。
- 时钟
- 时长
- 时间点
来自系统范畴实时时钟的挂钟时间
std::chrono::system_clock
class system_clock; (C++11 起)
类 std::chrono::system_clock
表示系统范围的实时壁钟。
它可以不单调:大多数系统上,系统时间可以在任何时候被调节。它是唯一有能力映射其时间点到 C 风格时间,从而能显示 (C++20 前)的 C++ 时钟。
std::chrono::system_clock
满足平凡时钟 (TrivialClock) 的要求。
成员类型
成员类型 | 定义 |
rep | 表示时钟时长中计次数的有符号算术类型 |
period | 表示时钟计次周期的 std::ratio 类型,单位为秒 |
duration | std::chrono::duration<rep, period> ,足以表示负时长 |
time_point | std::chrono::time_point<std::chrono::system_clock> |
成员常量
constexpr bool is_steady [静态] | 若时间间隔计次始终为常数,即纵使在调整了外部时钟的情况下,调用 now() 的返回值亦单调递增,则为 true ;否则为 false |
返回表示时间中当前点的 std::chrono::time_point
std::chrono::system_clock::now
static std::chrono::time_point<std::chrono::system_clock>
now() noexcept; (C++11 起)
返回表示当前时间的时间点。
参数
(无)
返回值
表示当前时间的时间点。
调用示例
#include <iostream>
#include <vector>
#include <numeric>
#include <chrono>
volatile int sink;
int main()
{
for (auto size = 1ull; size < 1000000000ull; size *= 100)
{
// 记录开始时间
// auto start = std::chrono::system_clock::now();
std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
// 做一些工作
std::vector<int> v(size, 100);
sink = std::accumulate(v.begin(), v.end(), 0u); // 确保其副效应
// 记录结束时间
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Time to fill and iterate a vector of "
<< size << " ints : " << diff.count() << " s\n";
}
}
输出
转换系统时钟时间点为 std::time_t
std::chrono::system_clock::to_time_t
static std::time_t to_time_t
( const time_point& t ) noexcept; (C++11 起)
转换 t
为 std::time_t 类型。
若 std::time_t 拥有较低精度,则是舍入还是截断值是实现定义的。
参数
t | - | 要转换的系统时钟时间点 |
返回值
表示 t
的 std::time_t 值。
调用示例
#include <iostream>
#include <vector>
#include <chrono>
#include<thread>
int main()
{
int s = 1;
for (auto size = 1ull; size < 1000000000ull; size *= 100)
{
// 记录开始时间
// auto start = std::chrono::system_clock::now();
std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
// 做一些工作
std::this_thread::sleep_for(std::chrono::seconds(s));
// 记录结束时间
auto end = std::chrono::system_clock::now();
std::time_t start_t = std::chrono::system_clock::to_time_t(start);
std::time_t end_t = std::chrono::system_clock::to_time_t(end);
std::cout << "end_t( " << end_t << " ) - start_t( " << start_t << " ) = " << end_t - start_t << std::endl;
s++;
}
}
输出
转换 std::time_t 到系统时钟时间点
std::chrono::system_clock::from_time_t
static std::chrono::system_clock::time_point
from_time_t( std::time_t t ) noexcept; (C++11 起)
用二个类型间的较低精度,转换 t
为时间点类型。
若 time_point
拥有较低精度,则舍入还是截断值是实现定义的。
参数
t | - | 要转换的 std::time_t 值 |
返回值
表示 t
的 std::chrono::system_clock::time_point 类型值。
调用示例
#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
int main()
{
int s = 1;
// 记录开始时间
// auto start = std::chrono::system_clock::now();
std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
std::time_t start_t = std::chrono::system_clock::to_time_t(start);
for (auto size = 1ull; size < 1000000000ull; size *= 100)
{
// 记录结束时间
auto end = std::chrono::system_clock::from_time_t(start_t + s);
std::chrono::duration<double> diff = end - start;
std::cout << "Time to fill "
<< size << " ints : " << diff.count() << " s\n";
s++;
}
}