计时有很多用途,比如:测试某一段代码的运行时间,时间越短,则性能相对越高。
1. 首先给出我以前常用的一种“传统”的计时方法:此方法可以精确到毫秒,输出样例:花费了0.123秒
#include
using namespace std;
clock_t start = clock();
// do something...
clock_t end = clock();
cout << "花费了" << (double)(end - start) / CLOCKS_PER_SEC << "秒" << endl;
2. c++11 新特性
#include
using namespace std;
// #2 steady_clock, the time is steady
auto start = chrono::steady_clock::now();
auto end =start + chrono::seconds(2);
auto time_span=chrono::duration_cast(end - start); // in milliseconds
// cout << start.time_since_epoch().count() << endl; // in nano
// cout<<"after 2 second, now is " << end.time_since_epoch().count() << endl; // in nano
cout << time_span.count() <<" milliseconds has passed\n";
关键词 auto 可以自动推断类型。
system_clock 是 C++11 提供的一个 clock。除此之外,还有两个clock:steady_clock 和 high_resolution_clock
C++11的 #include< chrono >和传统的 #include < ctime >相比,虽然写的代码量多了一点,但精度也更高~
-------------------------补充chrono-------2019-10-04--
今天比较系统的学习了chrono里面的东西,而不是只会用上面提到的计时工具喽,加油^_^
chrono 头文件总体来说设计三个概念,clock, duration, time_point
#1 clock
1.1 system_clock (这个与本地系统时间相关,由于可以修改系统时间故这个时钟不稳定)
1.2 steady_clock(这个时钟稳定,不受本地时间影响)
1.3 high_precision_clock(提供拥有最小计数周期的时钟,通常为系统时钟或稳定时钟的别名,也可能是第三个独立时钟,我的ubuntu上是system_clock的别名)
# 2 duration (一段时间,两个参数的模板类)
template< class Rep, class Period = std::ratio<1> >
class duration;
注:为了方便表示,chrono空间中提供了一些别名
typedef duration
nanoseconds;
typedef durationmicroseconds;
typedef durationmilliseconds;
typedef durationseconds;
typedef duration> minutes;
typedef duration> hours;
注:duration之间也可以进行转换
auto val = duration_cast
// 精度高转换成精度低的时候会导致精度丢失,需要注意
#include
#include
int main()
{
std::chrono::milliseconds scd(10001);
std::cout << scd.count() << std::endl; // 10001
std::cout << std::chrono::duration_cast(scd).count() << std::endl; // 10
return 0;
}
#3 time_point
std::chrono::time_point用于表示一个时间点,需要为时间点指定参考时钟和和相对于参考时钟步进值duration。
template
class time_point;
#include
#include
using namespace std::chrono;
int main()
{
system_clock::time_point now = system_clock::now(); // now表示当前时间到格林威治标准时间的nano
//等效于time_point now = system_clock::now();
std::cout << now.time_since_epoch().count() << std::endl;
return 0;
}
# 最后给一个列子:
#include
#include
using namespace std;
void my_time_point(){
// we need to know 3 concepts:clock, duraton and time_point
// #1 system_clock is not steay, and it is the time passed since 1970-01-01
chrono::system_clock::time_point tp = chrono::system_clock::now();
cout << tp.time_since_epoch().count()<< endl; // in nano
tp =tp + chrono::seconds(2);
cout<<"after 2 second, now is " << tp.time_since_epoch().count() << endl; // in nano
// #2 steady_clock, the time is steady
auto start = chrono::steady_clock::now();
auto end =start + chrono::seconds(2);
auto time_span=chrono::duration_cast(end - start); // in milliseconds
// cout << start.time_since_epoch().count() << endl; // in nano
// cout<<"after 2 second, now is " << end.time_since_epoch().count() << endl; // in nano
cout << time_span.count() <<" milliseconds has passed\n";
}
int main(){
my_time_point();
return 0;
}