我正在玩std :: chrono。 当我做一些测试时,我想知道我是否可以获得用于构建std :: chrono :: duration的比率,因为我想打印它。
这里有一些代码可以显示我想要做什么:
你可以通过添加-std=c++11
标志在windows和linux(g ++)上编译它。
这个小样本代码应该测量机器需要cout
到max int值的时间。
的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
实际样本输出
count to max of int ...
finished.
It took me 81.6503 Seconds.
81650329344
81650331344
目标样本输出
count to max of int ...
finished.
It took me 81.6503 Seconds.
81650329344 (1/1000000000)sekonds
81650331344
即使我不知道用于创建stopchrono对象的是什么,如何从返回的持续时间中获取已使用的句点std::ratio<1,1000000000>
?
这甚至可能吗?
答案 0 :(得分:3)
std::chrono::duration
类有一个typedef period
,这就是你要找的东西。您可以通过decltype(your_variable)::period
访问它。像下面这样的东西应该做
auto elapsed = main_timer.elapsed();
cout << elapsed.count() << " " << decltype(elapsed)::period::num << "/"
<< decltype(elapsed)::period::den << endl;
另见this working example,它打印经过的时间和秒数的比率。