C++11: chrono

14085 ワード

chronoはtime-libraryで、chronoというライブラリを使用するにはincludeが必要です.
通常chronoというライブラリを使用するにはratioというライブラリが欠かせない、#includeを含める必要があり、すでに#includeがある場合は#includeを必要としない.
 
まず2つの概念を明らかにします.
duration(期間):ある時間単位における明確なtick(一時数)を指す.例を挙げると、「3分」は「3個1分」を指す.
timepointとは、durationとepoch(開始点)の組み合わせを意味する.典型的な例は、「1970年1月1日からの第1 262 300 400秒」と記述される「2000年新年真夜中」時点である.
ratio:

 template <intmax_t Numerator, intmax_t Denominator = 1> class ratio;

Numerator:  .

Denominator: .

ratio :

ratio::num; // ratio .

ratio::den; // ratio .


#include <iostream>
#include <ratio>

int main()
{
 std::ratio<1, 4> oneForth;
 std::cout<<"Numrator: "<<oneForth.num<<std::endl; //  : 1.
 std::cout<<"Denominator: "<<oneForth.den<<std::endl; //  : 4.
 
 return 0;
}

 

std::chrono::duration

.


 template <class Rep, class Period = ratio<1> >
class duration;

Rep: (int, double....), .

Period: std::ratio .

:


 std::chrono::duration<int, std::ratio<1,1>> seconds(3);//3 .

duration ( std::duration, std::ratio ) :


template <class ToDuration, class Rep, class Period>
  constexpr ToDuration duration_cast (const duration<Rep,Period>& dtn);

ToDuration: duration .

Rep: duration .

Period: duration std::ratio .

duration :


 constexpr rep count() const;

duration std::ratio .


 static constexpr duration zero();

0 duration.

 


 static constexpr duration min();

.

 


 static constexpr duration zero();

.

 


#include <iostream>
#include <ratio>
#include <chrono>

int main()
{
 using second_type = std::chrono::duration<int, std::ratio<1, 1>>;
 using minutes_type = std::chrono::duration<int, std::ratio<60, 1>>;
 using hour_type = std::chrono::duration<int, std::ratio<3600, 1>>; 
 
 second_type oneDay1(24*3600); //  :24*3600 . 
 minutes_type oneDay2(24*60); //  : 24*60  . 
 hour_type oneDay3(24);      //  : 24  . 
 
 //hour_type oneDay4(oneDay2); //error.      . 
 hour_type oneDay5(oneDay3); // ok.
 hour_type oneDay6(std::chrono::duration_cast<hour_type>(oneDay2)); //ok.
 
 std::cout<< oneDay3.count() <<std::endl; //  : 24.
 hour_type threeDay = oneDay3 * 3;        // 3 : 3*24 
 std::cout<< threeDay.count() <<std::endl;//  : 3 * 24. 
 
 
 std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now(); //      . 
 std::cout<< "Print something..."<<std::endl;
 std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now(); //      . 
 std::chrono::steady_clock::duration d = t2 - t1; //   std::cout<<"Print something..."<<std::endl;     . 
 //        steady_clock  duration. 
 if(d == std::chrono::steady_clock::duration::zero()){  //          0. 
  std::cout<<"The interal clock did not tick
"<<std::endl;     }else{   std::cout<<"The interal clock advanced! "<< d.count() <<std::endl;     }      using namespace std::chrono;  milliseconds ms(7255042);    hours hh = duration_cast<hours>(ms);  minutes mm = duration_cast<minutes>(ms % hours(1)); // ms std::chrono::milliseconds .   seconds ss = duration_cast<seconds>(ms % minutes(1));  std::cout<<"hours: "<<hh.count()<<" minutes: "<<mm.count()<<" seconds: "<<ss.count()<<std::endl;    return 0; }

 

Clock:

Clock epoch( ) tick( , period). Clock (tick) (millionsecond), UNIX epoch( ): 1970 1 1 , (tick) (nanosecond), .

Clock “ Clock ” timepoint , Clock now() “ ” timepoint .

 

Clock( ) :

std::system_clock;  // timepoint( ) . clock to_time_t() from_time_t(), timepoint C time_t 。

std::steady_clock;  // 。 , timepoint , timepoint .

std::high_resolution_clock;  // tick( ) clock.( 1 ).

, clock , epoch( ), " timepoint "

  3 Clock :

Clock::duration  // Clock duration( ) . Clock .

Clock::rep  // duration :double ,int , , :Clock::duration::rep

Clock::period // Clock duration , , ? ? std::ratio .

Clock::duration::period.

Clock::is_steady // Clock steady , true.

Clock::now()  // static , .

 


 #include <iostream>
#include <chrono>
#include <type_traits>

template<typename Clock, typename = typename std::enable_if< std::is_same<Clock, std::chrono::steady_clock>::value
                                                          || std::is_same<Clock, std::chrono::system_clock>::value
                      || std::is_same<Clock, std::chrono::high_resolution_clock>::value
                      >::type>
void printClockData()
{
 std::cout<<"- precision: ";
 using P = typename Clock::period; //   Clock::duration::period;     std::ratio  .
 
 if(std::ratio_less_equal<P, std::milli>::value){
  using TT = typename std::ratio_multiply<P, std::kilo>::type; //   type std::ratio  .
  std::cout<< std::fixed << double(TT::num)/TT::den << " milliseconds " << std::endl; 
  
 }else{
  std::cout<< std::fixed << double(P::num)/P::den <<" seconds"<<std::endl;
 } 
 
 std::cout<<"- is_steady: "<< std::boolalpha << Clock::is_steady << std::endl;
}

int main()
{
 std::cout<< "system_clock: " <<std::endl;
 printClockData<std::chrono::system_clock>();
 std::chrono::system_clock::time_point t1 = std::chrono::system_clock::now();
 std::cout<< "system_clock::now() "<<std::endl;
 std::chrono::system_clock::duration sd = std::chrono::system_clock::now() - t1;
 std::cout<< "cost: "<< sd.count() <<std::endl; //  : 0 
 
 
 std::cout<< "
high_resolution_clock: "<<std::endl;  printClockData<std::chrono::high_resolution_clock>();  std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();  std::cout<< "high_resolution_clock::now() " <<std::endl;  std::chrono::high_resolution_clock::duration hd = std::chrono::high_resolution_clock::now() - t2;  std::cout<< "cost: "<< hd.count() <<std::endl; // : 0    std::cout<< "
steady_clock: "<<std::endl;  printClockData<std::chrono::steady_clock>();  std::chrono::steady_clock::time_point t3 = std::chrono::steady_clock::now();  std::cout<< "steady_clock::now() "<<std::endl;  std::chrono::steady_clock::duration ssd = std::chrono::steady_clock::now() - t3;  std::cout<<"cost: "<< ssd.count() <<std::endl;    std::chrono::duration<std::chrono::steady_clock::rep, std::chrono::steady_clock::period> du = ssd;  std::chrono::steady_clock::period ratioForSteady_clock;  std::cout<< ratioForSteady_clock.num << " " << ratioForSteady_clock.den <<std::endl;    return 0; }

 

Timepoint( ):

( ) clock, clock, timepoint。Class time_point , clock .


template <class Clock, class Duration = typename Clock::duration>
 class time_point;

4 timepoint .

1,Epoch, clock time_point default .

2,Current time, clock static now() .

3,Minimnum timepoint, clock timepoint static min() .

4,Maximum timepoint, clocktimepoint static max() .


#include <iostream>
#include <chrono>
#include <ctime>
#include <string>

std::string asString(const std::chrono::system_clock::time_point& tp)
{
	std::time_t t = std::chrono::system_clock::to_time_t(tp);
	std::string timeString = std::asctime(std::gmtime(&t));
	//timeString.resize(timeString.size()-1);
	return timeString;
} 

int main()
{
	std::chrono::system_clock::time_point tp;
	std::cout<< "epoch: "<< asString(tp) <<std::endl;
	
	tp = std::chrono::system_clock::now();
	std::cout<< "now: "<< asString(tp) <<std::endl;
	 
	/*tp = std::chrono::system_clock::time_point::min();
	std::cout<< "min: "<< asString(tp) <<std::endl;*/ //                  (timepoint).
	
	//   std::chrono::time_point_cast; 
	using userDefined = std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<int, std::micro>>;
	userDefined tp1 = std::chrono::time_point_cast<std::chrono::duration<int, std::micro>>(std::chrono::system_clock::time_point::min());
	std::cout<< "min: "<< asString(tp1) <<std::endl;
	
	
	//   std::chrono::time_point     . 
	std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<int>> t_p;
	std::chrono::system_clock::time_point tp2(t_p);
	tp2 = std::chrono::system_clock::time_point::max();
	std::cout<< "max: "<< asString(tp2)<<std::endl;
	
	return 0;
}

std::chrono::time_point operator(s):


#include <iostream>
#include <ctime>
#include <chrono>
#include <string>

std::string asString(const std::chrono::system_clock::time_point& tp)
{
	std::time_t t = std::chrono::system_clock::to_time_t(tp);
	
	std::string timeString(std::ctime(&t));
	return timeString;
}

int main()
{
	using Days = std::chrono::duration<int, std::ratio<3600*24>>; 
	using Hours = std::chrono::duration<int, std::ratio<3600>>;
	using Minutes = std::chrono::duration<int, std::ratio<60>>;
	using Seconds = std::chrono::duration<int, std::ratio<1,1>>;
	using Years = std::chrono::duration<unsigned long long, std::ratio<3600*24*365>>;
	
	
	
	std::chrono::time_point<std::chrono::system_clock> tp1;  
	std::cout<< "Epoch: "<< asString(tp1) <<std::endl;  //   : asString(std::chrono::system_clock::time_point()); 
	
	// 1 ,23  ,55  .
	tp1 += Days(1) + Hours(23) + Minutes(55);
	std::cout<<"Later: " << asString(tp1) << std::endl;
	
	std::chrono::duration<std::chrono::system_clock::rep, std::chrono::system_clock::period> dis = tp1 - std::chrono::system_clock::time_point();
	// :        std::chrono::system_clock::time_point();    Epoch.
	 std::cout<< "Diff:    "
	          << (std::chrono::duration_cast<std::chrono::minutes>(dis)).count()
	          << " minute(s)." <<std::endl;
	Days days = std::chrono::duration_cast<Days>(dis);
	std::cout<< "days:    "
	         << days.count() << " day(s)."<<std::endl;
	         
    tp1 -= Days(365); //          .
	std::cout<< "-1 year:   " << asString(tp1) <<std::endl; 
	
	tp1 -= Years(50); //           .
	std::cout<< "-50 years:  " << asString(tp1) <<std::endl;
	 
	tp1 -= Years(50); //           .
	std::cout<< "again -50 years:  " << asString(tp1) <<std::endl;
	
	
	return 0; 
	
}