I was playing arround with std::chrono. While i do some testing i wonder if i can get the ratio that was used to construct a std::chrono::duration because i want to print it.
Here some code to show what exactly i want to do:
You schould be able to compile this on windows and linux (g++) by adding the -std=c++11 flag. This small sample code should measure the Time your machine needs to cout to max int value.
main.cpp
#include<iostream>
#include "stopchrono.hpp"
#include<chrono>
#include<limit>
int main (){
stopchrono<> main_timer(true);
stopchrono<unsigned long long int,std::ratio<1,1000000000>,std::chrono::high_resolution_clock> m_timer(true);//<use long long int to store ticks,(1/1000000000)sekond per tick, obtain time_point from std::chrono::high_resolution_clock>
stopchrono<unsigned long long int,std::ratio<1,1000000000>> mtimer(true);
std::cout<<"count to max of int ..."<<std::endl;
for(int i=0;i<std::numeric_limits<int>::max();i++){}
std::cout<<"finished."<<std::endl;
main_timer.stop();
m_timer.stop();
mtimer.stop();
std::cout<<std::endl<<"It took me "<<(main_timer.elapsed()).count()<<" Seconds."<<std::endl;
std::cout<<" "<<(m_timer.elapsed()).count()<<std::endl;//print amount of elapsed ticks by std::chrono::duration::count()
std::cout<<" "<<(mtimer.elapsed()).count()<<std::endl;
std::cin.ignore();
return 0;
}
stopchrono.hpp
#ifndef STOPCHRONO_DEFINED
#define STOPCHRONO_DEFINED
#include<chrono>
template<class rep=double,class period=std::ratio<1>,class clock=std::chrono::steady_clock> //this templates first two parameters determines the duration type that will be returned, the third parameter defines from which clock the duration will be obtained
class stopchrono { // class for measurement of time programm parts are running
typename clock::time_point start_point;
std::chrono::duration<rep,period> elapsed_time;
bool running;
public:
stopchrono():
start_point(clock::now()),
elapsed_time(elapsed_time.zero()),
running(false)
{}
stopchrono(bool runnit)://construct already started object
running(runnit),
elapsed_time(elapsed_time.zero()),
start_point(clock::now())
{}
void start(){//set start_point to current clock::now() if not running
if(!running){
start_point=clock::now();
running=true;
}
}
void stop(){// add current duration to elapsed_time
if(running){
elapsed_time+=std::chrono::duration_cast<std::chrono::duration<rep,period>>(clock::now()-start_point);
running=false;
}
}
void reset(){// set elapsed_time to 0 and running to false
elapsed_time=elapsed_time.zero();
running=false;
}
std::chrono::duration<rep,period> elapsed(){//return elapsed_time
if(running){
return (std::chrono::duration_cast<std::chrono::duration<rep,period>>(elapsed_time+(clock::now()-start_point)));
}else{
return (elapsed_time);
}
}
bool is_running()const{// determine if the timer is running
return running;
}
};
#endif
actual sample output
count to max of int ...
finished.
It took me 81.6503 Seconds.
81650329344
81650331344
target sample output
count to max of int ...
finished.
It took me 81.6503 Seconds.
81650329344 (1/1000000000)sekonds
81650331344
How can i obtain the used period std::ratio<1,1000000000>
from the returned duration even if i dont know which i have used to create the stopchrono object? Is that even possible?
Aucun commentaire:
Enregistrer un commentaire