C++11计时器之chrono库简介

  #define _CRT_SECURE_NO_WARNINGS //localtime()需要这个宏

  #include

  #include

  #include

  #include

  #include

  //#include

  #include //put_time需要的头文件

  #include

  // template

  // struct treat_as_floating_point : is_floating_point<_Rep> {}; // tests for floating-point type

  // template

  // _INLINE_VAR constexpr bool treat_as_floating_point_v = treat_as_floating_point<_Rep>::value;

  // // STRUCT TEMPLATE duration_values

  // template

  // struct duration_values { // gets arithmetic properties of a type

  // _NODISCARD static constexpr _Rep zero() noexcept {

  // // get zero value

  // return _Rep(0);

  // }

  // _NODISCARD static constexpr _Rep(min)() noexcept {

  // // get smallest value

  // return numeric_limits<_Rep>::lowest();

  // }

  // _NODISCARD static constexpr _Rep(max)() noexcept {

  // // get largest value

  // return (numeric_limits<_Rep>::max)();

  // }

  // };

  //时间长度

  void Func1(){

  //chrono重载了各种运算符

  std::chrono::hours c1(1); //1小时

  std::chrono::minutes c2(60); //60分钟

  std::chrono::seconds c3(60*60); //60*60s

  std::chrono::milliseconds c4(60*60*1000); //60*60*1000毫秒

  std::chrono::microseconds c5(60*60*1000*1000); //微秒 溢出

  std::chrono::nanoseconds c6(60*1000*1000*1000);//纳秒 溢出

  if(c1==c2){

  std::cout<<"c1==c2"<

  }

  if(c1==c3){

  std::cout<<"c1==c3"<

  }

  if(c2==c3){

  std::cout<<"c2==c3"<

  }

  //获取时钟周期的值,返回的是int整数

  std::cout<<"c1= "<

  std::cout<<"c2= "<

  std::cout<<"c3= "<

  std::cout<<"c4= "<

  std::chrono::seconds c7(1); //1秒

  std::chrono::milliseconds c8(1*1000); //1000毫秒;1s

  std::chrono::microseconds c9(1*1000*1000); //1000*1000微秒 1s

  std::chrono::nanoseconds c10(1*1000*1000*1000);//1000*1000*1000纳秒 1s;

  std::cout<

  std::cout<

  std::cout<

  std::cout<

  }

  //系统时间

  /**

  * @brief

  *

  * system_clock 类支持了对系统时钟的访问, 提供了三个静态成员函数:

  返回当前时间的时间点。

  static std::chrono::time_point now() noexcept;

  将时间点 time_point 类型转换为 std::time_t 类型。

  static std::time_t to_time_t( const time_point& t ) noexcept;

  将 std::time_t 类型转换为时间点 time_point 类型。

  static std::chrono::system_clock::time_point from_time_t( std::time_t t ) noexcept;

  */

  void Func2(){

  //静态成员函数 static std::chrono::time_point now() noexcept

  //这些都可以简写用auto now=std::chrono::system_clock()::now()接收

  //1、静态成员函数 static std::chrono::system_clock::now()用来获取系统时间,C++时间

  std::chrono::time_point now=std::chrono::system_clock::now();

  //2、静态成员函数 static std::chrono::system_clock::to_time_t()把C++系统时间转换为time_t (utc时间)

  time_t t_now=std::chrono::system_clock::to_time_t(now);

  //3、std::localtime()函数把time_t时间转换为本地时间(北京时间)

  // std::localtime()不是线程安全的,VS用localtime_t()代替,linux用local_time_r()代替

  //tm结构体

  tm* tm_now=localtime(&t_now);

  //格式化输出tm结构体中的成员

  std::cout<

  std::cout<

  std::cout<

  //但是通常C++一般不打印出时间,而是把时间存储到一个字符串中

  std::stringstream ss; //创建stringstream对象 ss,需要包含头文件

  ss<

  std::string time_str=ss.str();

  std::cout<

  }

  // struct steady_clock { // wraps QueryPerformanceCounter

  // using rep = long long;

  // using period = nano;

  // using duration = nanoseconds;

  // using time_point = chrono::time_point;

  // static constexpr bool is_steady = true;

  // _NODISCARD static time_point now() noexcept { // get current time

  // const long long _Freq = _Query_perf_frequency(); // doesn't change after system boot

  // const long long _Ctr = _Query_perf_counter();

  // static_assert(period::num == 1, "This assumes period::num == 1.");

  // // Instead of just having "(_Ctr * period::den) / _Freq",

  // // the algorithm below prevents overflow when _Ctr is sufficiently large.

  // // It assumes that _Freq * period::den does not overflow, which is currently true for nano period.

  // // It is not realistic for _Ctr to accumulate to large values from zero with this assumption,

  // // but the initial value of _Ctr could be large.

  // const long long _Whole = (_Ctr / _Freq) * period::den;

  // const long long _Part = (_Ctr % _Freq) * period::den / _Freq;

  // return time_point(duration(_Whole + _Part));

  // }

  // };

  // using high_resolution_clock = steady_clock;

  // } // namespace chrono

  //计时器 steady_clock 类相当于秒表,操作系统只要启动就会进行时间的累加,常用于耗时的统计(精确到纳秒) 。

  void Func3(){

  //静态成员函数std::chrono::steady_clock::now()获取时间的开始点

  std::chrono::time_point start=std::chrono::steady_clock::now();

  //auto start=std::chrono::steady_clock::now();

  //执行一些代码,消耗时间

  std::vector vec1{"banana","apple","pear"};

  std::for_each(vec1.begin(),vec1.end(),[&vec1](std::string str){

  std::cout<

  });

  std::cout<

  //静态成员函数std::chrono::steady_clock::now()获取时间的结束点

  auto end=std::chrono::steady_clock::now();

  //计算消耗的时间,单位是纳秒

  auto dt=end-start;

  std::cout<<"耗时: "<

  }

  int main(int argc,char* argv[]){

  Func1();

  Func2();

  Func3();

  return 0;

  }