std chrono time

1 综述

简介

  • Chrono 这个函数库,主要是为 C++ STL 加入一个可以取得、处理时间与日期的函数库;透过这个函数库,我们可以在程序里面取得时间、并针对时间做处理、计算。而像是 STL Thread 的 sleep_for() 或 sleep_until(),也都是透过 chrono 提供的型别来做设定。
  • 头文件:#include , 命名空间:std:chrono

记录时间类别

  • chrono 最主要的是下面这两种用来记录时间的类别:
    纪录时间点的: time_point
    纪录时间长度的: duration

三种时钟

  • chrono 有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock;三者区别
  1. steady_clock 是单调的时钟,即每后一次调用都一定会比前一次调用的时间要晚,它并不反映真实的世界时间。在内部的实现中,有可能是系统开启以来的时间。通过该时钟很适合用来获取一段时间内的间隔,它不随系统时间改变而改变。;
  2. system_clock 是系统的时钟;就是系统时钟,他一般是unix时间,即从1970年1月1日到现在的间隔。因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。
  3. high_resolution_clock 是当前系统能够提供的最高精度的时钟;它也是不可以修改的。相当于 steady_clock 的高精度版本。

Eg: 得到时间差

auto start_t = std::chrono::system_clock::now();    //起始时间
auto end_t = std::chrono::system_clock::now();    //结束时间
std::chrono::duration<double> diff = end_t - start_t;//时间间隔s
std::chrono::duration_cast<std::chrono::milliseconds>(end_t - start_t).count();//时间间隔ms

2. 记录时间类别

2.1 duration

  • duration 是 chrono 里面用来记录时间长度的类别,他基本上是一个 template class,可以自行定义他的意义;chrono 也有提供一些比较常见的时间类别,可以直接拿来使用。
    下面就是内建的 duration 的型别:
typedef duration<long long, nano> nanoseconds;
typedef duration<long long, micro> microseconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long> seconds;
typedef duration<int, ratio<60> > minutes;
typedef duration<int, ratio<3600> > hours;
  • 如果要取得一个 duration 的值的话,则是要呼叫他的 count() 这个函式。
    例如:
std::chrono::minutes t1( 10 );  //代表10min
std::chrono::seconds t2( 60 );  //代表60s
std::chrono::seconds t3 = t1 - t2;
std::cout << t3.count() << " second" << std::endl;
  • 如果想要做强制的时间单位转换,也可以使用 duration_cast<>() 这个函式来做;下面就是一个把以秒为单位的 t3 转换成分钟后再输出。
std::cout << std::chrono::duration_cast<chrono::minutes>( t3 ).count() << std::endl;

2.2 time_point

  • time_point 是用来记录一个特定时间点的时间类别。他一样是一个 template class,需要指定要使用的 clock 与时间单位(duration)。
std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
std::cout << "Hello World\n";
std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();
std::cout << "Printing took "
  << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count()
  << "us.\n";
  • time_point 也可以和 duration 做计算,得出新的 time_point。
    一般使用
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::chrono::system_clock::time_point nt = now + std::chrono::hours(10);

2.3 三种时钟

system_clock的主要方法有3个,分别是:

  • now,用来获取当前时间。
  • to_time_t,用来将系统时间转变为std::time_t类型。
  • from_time_t,用来将std::time_t类型转换为系统时间点。

Eg,使用system_clock获取当前系统时间

#include <iostream>
#include <chrono>
int main() {    
    auto time = std::chrono::system_clock::now();
    auto tt = std::chrono::system_clock::to_time_t(time);
    std::cout << std::put_time(std::localtime(&tt), "%Y-%m-%d %H:%M:%S") << std::endl;
    
    return 0;
}

统计函数的执行耗时,这种情况更适合使用steady_clock。

#include <iostream>
#include <chrono>

long fibonacci(unsigned n)
{
    if (n < 2) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main()
{
    auto start = std::chrono::steady_clock::now();
    std::cout << "f(42) = " << fibonacci(42) << '\n';
    auto end = std::chrono::steady_clock::now();
    std::chrono::duration<double> elapsed_seconds = end-start;
    std::cout << "elapsed time: " << elapsed_seconds.count() << "s\n";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值