C++11 新的计时方法——std::chrono 大法好

计时有很多用途,比如:测试某一段代码的运行时间,时间越短,则性能相对越高。

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

  1. now( ) 表示计时的那“一瞬间”
  2. duration_cast< > 表示类型转换
  3. microseconds 表示微妙。除此之外,还有五种时间单位:hours, minutes, seconds, milliseconds, nanoseconds
  4. num 和 den分别表示分子(numerator)和分母(denominator)。在我给出的代码中,num等于1, den等于1,000,000
  5. count( ) 用来返回时间

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 duration microseconds;
typedef duration milliseconds;
typedef duration seconds;
typedef duration > minutes;
typedef duration > hours;

注:duration之间也可以进行转换

auto val = duration_cast(para);

// 精度高转换成精度低的时候会导致精度丢失,需要注意
#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;
}

 

你可能感兴趣的:(C++,学习)