C++11为我们提供了三种时钟类型:system_clock、steady_clock、high_resolution_clock。这三个时间类都提供了rep(周期)、period(单位比率)、duration(成员类型)。这三个时钟类都提供了一个静态成员函数 now() 用于获取当前时间,该函数的返回值是一个 time_point 类型。
注意: 虽然这三个时钟都很多相同的成员类型和成员函数,但它们是没有亲缘关系的。这三个时钟类型都是类,并非模板类。
三个时钟的区别:
- system_clock:类似Windows系统右下角那个时钟,是系统时间。明显这个时钟是可以自己设置的。system_clock除了now()函数外,还提供了to_time_t()静态成员函数。用于将系统时间转换成熟悉的std::time_t类型,得到了std::time_t类型的值,就可以很方便地打印当前时间了。
- steady_clock:是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时,他表示时钟是不能设置的。
- high_resolution_clock:是当前系统能够提供的最高精度的时钟;它也是不可以修改的。相当于 steady_clock 的高精度版本。
举例说明:
- 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的参数,这会导致编译通不过。因为类型不匹配。
- 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;
}
结果: