Bootstrap

c++11 日期和时间工具-(std::chrono::steady_clock)(std::chrono::high_resolution_clock)

定义于头文件 <chrono>

std::chrono

chrono 库定义三种主要类型以及工具函数和常用 typedef 。

  • 时钟
  • 时长
  • 时间点

决不会调整的单调时钟

std::chrono::steady_clock
class steady_clock;          (C++11 起) 

std::chrono::steady_clock 表示单调时钟。此时钟的时间点无法减少,因为物理时间向前移动。此时钟与壁钟时间无关(例如,它能是上次重启开始的时间),且最适于度量间隔。

std::chrono::steady_clock 满足平凡时钟 (TrivialClock) 的要求。

成员类型

成员类型定义
rep表示时钟时长中计次数的算术类型
period表示时钟计次周期的 std::ratio 类型,单位为秒
durationstd::chrono::duration<rep, period>
time_pointstd::chrono::time_point<std::chrono::steady_clock>

成员常量

constexpr bool is_steady

[静态]

稳定时钟标志,始终为 true

返回表示当前时钟值的 time_point

std::chrono::steady_clock::now
static std::chrono::time_point<std::chrono::steady_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::steady_clock::now();
        // 做一些工作
        std::vector<int> v(size, 100);
        sink = std::accumulate(v.begin(), v.end(), 0u); // 确保其副效应
        // 记录结束时间
        auto end = std::chrono::steady_clock::now();
        std::chrono::duration<double> diff = end - start;
        std::cout << std::fixed << "Time to fill and iterate a vector of "
                  << size << " ints : " << diff.count() << " s\n";
    }
}

输出

 

拥有可用的最短嘀嗒周期的时钟

std::chrono::high_resolution_clock
class high_resolution_clock;      (C++11 起) 

std::chrono::high_resolution_clock 表示实现提供的拥有最小计次周期的时钟。它可以是 std::chrono::system_clock 或 std::chrono::steady_clock 的别名,或第三个独立时钟。

std::chrono::high_resolution_clock 满足平凡时钟 (TrivialClock) 的要求。

成员类型

成员类型定义
rep表示时钟的时期中计次数的算术类型
period表示时钟计次周期的 std::ratio 类型,单位为秒
durationstd::chrono::duration<rep, period>
time_pointstd::chrono::time_point<std::chrono::high_resolution_clock>

成员常量

constexpr bool is_steady

[静态]

若时间间隔计次始终为常量,即纵使在外部时钟调整的情况下,调用 now() 的返回值亦单调递增,则为 true ,否则为 false

返回表示时钟当前值的 std::chrono::time_point

std::chrono::high_resolution_clock::now
static std::chrono::time_point<std::chrono::high_resolution_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::high_resolution_clock::now();
        // 做一些工作
        std::vector<int> v(size, 42);
        sink = std::accumulate(v.begin(), v.end(), 0u); // 确保其副效应
        // 记录结束时间
        auto end = std::chrono::high_resolution_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";
    }
}

输出

 

;