C++11中时间库chrono的使用

  C++11为我们提供了三种时钟类型:system_clocksteady_clockhigh_resolution_clock。这三个时间类都提供了rep(周期)、period(单位比率)、duration(成员类型)。这三个时钟类都提供了一个静态成员函数 now() 用于获取当前时间,该函数的返回值是一个 time_point 类型。

注意: 虽然这三个时钟都很多相同的成员类型和成员函数,但它们是没有亲缘关系的。这三个时钟类型都是类,并非模板类。

三个时钟的区别:

  1. system_clock:类似Windows系统右下角那个时钟,是系统时间。明显这个时钟是可以自己设置的。system_clock除了now()函数外,还提供了to_time_t()静态成员函数。用于将系统时间转换成熟悉的std::time_t类型,得到了std::time_t类型的值,就可以很方便地打印当前时间了。
  2. steady_clock:是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时,他表示时钟是不能设置的。
  3. high_resolution_clock:是当前系统能够提供的最高精度的时钟;它也是不可以修改的。相当于 steady_clock 的高精度版本。

举例说明:

  1. system_clock案例:输出当前时间
#include <iostream>
#include <ratio>   //表示时间单位的库
#include <chrono>
#include<ctime>
using namespace std;
using namespace std::chrono;

int main() {

    auto tp = system_clock::now(); //获取系统当前时间点
    time_t cur_time = system_clock::to_time_t(tp);  //将时间转换为ctime的time_t格式

    char stime[30];
    errno_t err = ctime_s(stime, sizeof(stime), &cur_time);  //转换为字符串

    //cout << err << std::endl;
    cout << stime << std::endl;

    return 0;
}

结果:
在这里插入图片描述
在这里插入图片描述
注意:不要将steady_clock、high_resolution_clock时钟的now()返回值作为to_time_t的参数,这会导致编译通不过。因为类型不匹配。

  1. steady_clock例子
#include <iostream>
#include <ratio>   //表示时间单位的库
#include <chrono>
#include<ctime>
#include <thread>

using namespace std;
using namespace std::chrono;

int main() {

    auto begin = steady_clock::now();  //获取系统启动后到现在的时间点
    for (int i = 0; i < 10; ++i)
    {
        std::this_thread::sleep_for(seconds(1));
        std::cout << i << std::endl;
    }
    auto end = steady_clock::now();
    auto diff = (end - begin).count(); //返回时间差--【单位:纳秒】
    cout << "diff=" << diff << std::endl;
    return 0;

}

结果:
在这里插入图片描述
3. high_resolution_clock例子:打印一百个*号需要的时间

// high_resolution_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std;
using namespace std::chrono;

int main()
{
	high_resolution_clock::time_point t1 = high_resolution_clock::now();
	cout << "printing out 100 stars...\n";
	for (int i = 0; i < 100; ++i) {
		if (i % 10 == 0)cout << endl;
		cout << "*";
	}
	cout << endl; cout << endl;
	high_resolution_clock::time_point t2 = high_resolution_clock::now();
	cout << "in seconds time:";
	duration<double, ratio<1, 1>> duration_s(t2 - t1);
	cout << duration_s.count() << " seconds" << endl;
	cout << "in millisecond time:";

	//duration<double,std::ratio<1,1000>> duration_ms(t2-t1);
	duration<double, ratio<1, 1000>> duration_ms = duration_cast<duration<double, ratio<1, 1000>>>(t2 - t1);
	cout << duration_ms.count() << " milliseconds" << endl;
	cout << "in microsecond time:";

	//duration<double,std::ratio<1,1000000>> duration_ms(t2-t1);
	duration<double, ratio<1, 1000000>> duration_mcs = duration_cast<duration<double, ratio<1, 1000000>>>(t2 - t1);
	cout << duration_mcs.count() << " microseconds" << endl;
	duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
	cout << "It took me " << time_span.count() << " seconds.";
	cout << std::endl;

	return 0;
}

结果:
在这里插入图片描述

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值