C++ 11 chrono

chrono

目录

chrono

Abstract

duration

Abstract

How

Demo

time_point

Abstract

How

Demo

Clock

Abstract

How

Demo

Template


Abstract

c++11关于时间引入了chrono库,源于boost,功能强大,chrono主要有三个点:

  • duration
  • time_point
  • clocks

duration

Abstract

duration表示一段时间间隔

template<class Rep, class Period = std::ratio<1>> 
 class duration

Rep是一个数值类型,表示时钟个数,Period表示每个时钟周期的秒数。Period的默认模板参数是std::ratio

template<std::intmax_t Num, std::intmax_t Denom = 1> 
class ratio

Num代表分子,Denom代表分母。ratio<1>代表一个时钟周期是一秒,ratio<60>代表了一分钟,ratio<60*60>代表一个小时,ratio<1, 1000>代表一毫秒,ratio<1, 1000000>代表一微秒,ratio<1, 1000000000>代表一纳秒。

How

typedef duration <Rep, ratio<3600,1>> hours; 
typedef duration <Rep, ratio<60,1>> minutes;
typedef duration <Rep, ratio<1,1>> seconds;
typedef duration <Rep, ratio<1,1000>> milliseconds;          //毫秒
typedef duration <Rep, ratio<1,1000000>> microseconds;       //微秒
typedef duration <Rep, ratio<1,1000000000>> nanoseconds;     //纳秒

Demo

#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
int main()
{
    this_thread::sleep_for(chrono::seconds(3));        //休眠3秒
    this_thread::sleep_for(chrono::milliseconds(100)); //休眠100毫秒
    cout << "Hello" << endl;
    getchar();
    return 0;
}

time_point

Abstract

描述的是一个具体的时间点

原型是:

template<class _Clock, class _Duration = typename _Clock::duration>
class time_point

这里的duration 就是上面提到的,Clock之后会介绍。

How

 time_point<system_clock, hours> h = time_point_cast<hours>(system_clock::now());

Demo

#include <iostream>
#include <chrono>
using namespace std;
 
int main()
{
    using namespace std::chrono;
    time_point<system_clock, hours> h = time_point_cast<hours>(system_clock::now());
    cout << h.time_since_epoch().count() << " hours since epoch" << endl;
    getchar();
    return 0;
}

Clock

Abstract

clocks表示当前的系统时钟,内部有time_point, duration, Rep, Period等信息。

clocks包含三种时钟:

steady_clock 是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时;

system_clock 是系统的时钟;因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。

high_resolution_clock 是当前系统能够提供的最高精度的时钟;它也是不可以修改的。相当于 steady_clock 的高精度版本。

How

steady_clock

稳定的时间间隔,表示相对时间,相对于系统开机启动的时间,无论系统时间如何被更改,后一次调用now()肯定比前一次调用now()的数值大,可用于计时。

相当于教练手中的秒表;只会增长,适合用于记录程序耗时.

system_clock

表示当前的系统时钟,可以用于获取当前时间

high_resolution_clock

high_resolution_clock表示系统可用的最高精度的时钟,实际上就是system_clock或者steady_clock其中一种的定义,官方没有说明具体是哪个,不同系统可能不一样,我之前看gcc chrono源码中high_resolution_clock是steady_clock的typedef。

Demo

// copied from http://www.informit.com/articles/article.aspx?p=1881386&seqNum=2;
 
// Author: Nicolai M. Josuttis
 
 
#include <chrono>
 
#include <iostream>
 
#include <iomanip>
 
 
template <typename C>
 
void printClockData ()
 
{
 
using namespace std;
 
 
cout << "- precision: ";
 
// if time unit is less or equal one millisecond
 
typedef typename C::period P;// type of time unit
 
if (ratio_less_equal<P,milli>::value) {
 
// convert to and print as milliseconds
 
typedef typename ratio_multiply<P,kilo>::type TT;
 
cout << fixed << double(TT::num)/TT::den
 
<< " milliseconds" << endl;
 
}
 
else {
 
// print as seconds
 
cout << fixed << double(P::num)/P::den << " seconds" << endl;
 
}
 
cout << "- is_steady: " << boolalpha << C::is_steady << endl;
 
}
 
 
int main()
 
{
 
std::cout << "system_clock: " << std::endl;
 
printClockData<std::chrono::system_clock>();
 
std::cout << "\nhigh_resolution_clock: " << std::endl;
 
printClockData<std::chrono::high_resolution_clock>();
 
std::cout << "\nsteady_clock: " << std::endl;
 
printClockData<std::chrono::steady_clock>();
 
 
#ifdef _WIN32
 
system("pause");
 
#endif
 
return 0;
 
}
 
 
system_clock:
 
- precision: 0.000100 milliseconds
 
- is_steady: false
 
 
high_resolution_clock:
 
- precision: 0.000001 milliseconds
 
- is_steady: true
 
 
steady_clock:
 
- precision: 0.000001 milliseconds
 
- is_steady: true

Template

#include <chrono>

#define TIMERSTART(tag)  auto tag##_start = std::chrono::steady_clock::now(),tag##_end = tag##_start
#define TIMEREND(tag)  tag##_end =  std::chrono::steady_clock::now()
#define DURATION_s(tag) printf("%s costs %d s\n",#tag,std::chrono::duration_cast<std::chrono::seconds>(tag##_end - tag##_start).count())
#define DURATION_ms(tag) printf("%s costs %d ms\n",#tag,std::chrono::duration_cast<std::chrono::milliseconds>(tag##_end - tag##_start).count());
#define DURATION_us(tag) printf("%s costs %d us\n",#tag,std::chrono::duration_cast<std::chrono::microseconds>(tag##_end - tag##_start).count());
#define DURATION_ns(tag) printf("%s costs %d ns\n",#tag,std::chrono::duration_cast<std::chrono::nanoseconds>(tag##_end - tag##_start).count());


// usage:
//   TIMERSTART(for_loop);
//   for (int i = 0; i < 100000; i++)
//   {
//       i*i;
//   }
//   TIMEREND(for_loop);
//   DURATION_ms(for_loop);
C++中,`chrono`是用于时间操作的库,它位于`<chrono>`头文件中。如果你遇到了“`chrono`失效”的情况,这可能意味着你没有正确地使用`chrono`库,或者存在一些配置或代码上的问题。 通常,`chrono`库提供了一套时间测量的工具,包括时钟(Clocks)、持续时间(Durations)、时间点(Time points)等。如果你在使用`chrono`时遇到问题,这可能是由于以下几个原因: 1. 没有包含正确的头文件。确保你的代码中包含了`#include <chrono>`。 2. 使用了错误的命名空间。`chrono`库中的类型和函数位于`std`命名空间中,因此你需要在使用它们时加上`std::`前缀,除非你使用了`using namespace std;`。 3. 编译器不支持C++11或更高版本的特性。`chrono`是C++11中引入的,如果你的编译器不支持C++11或更高版本,那么你需要升级编译器或者禁用`chrono`的使用。 下面是一个简单的`chrono`使用示例,展示了如何使用`std::chrono::steady_clock`来测量代码段的执行时间: ```cpp #include <iostream> #include <chrono> #include <thread> int main() { // 开始时间点 auto start = std::chrono::steady_clock::now(); // 模拟一些耗时的操作 std::this_thread::sleep_for(std::chrono::seconds(1)); // 结束时间点 auto end = std::chrono::steady_clock::now(); // 计算持续时间 std::chrono::duration<double, std::ratio<1>> elapsed = end - start; // 输出耗时结果 std::cout << "Elapsed time: " << elapsed.count() << " seconds." << std::endl; return 0; } ``` 如果你仍然遇到`chrono`失效的问题,建议检查以下几点: 1. 确认你的编译环境和编译选项是否支持C++11或更高版本。 2. 查看是否有代码中的错误导致`chrono`库的某些功能无法使用。 3. 如果使用的是第三方库或者特殊环境,检查是否有与`chrono`相关的冲突或限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ym影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值