2016-01-26 2 views
2

Я играл в arround с std :: chrono. В то время как я делаю некоторые тесты, я задаюсь вопросом, могу ли я получить соотношение, которое использовалось для создания std :: chrono :: duration, потому что я хочу его распечатать.C++ получить период std :: chrono :: duration

Здесь какой-то код, чтобы показать, что именно я хочу сделать:

Вы schould иметь возможность компилировать это на окнах и Linux (г ++), добавив -std=c++11 флаг. Этот небольшой пример кода должен измерять время, необходимое вашей машине 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 

Как получить использованный период std::ratio<1,1000000000> из возвращаемой продолжительности, даже если я не знаю, что я использовал для создания объекта stopchrono? Возможно ли это?

ответ

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, который печатает истекшее время и соотношение секунд.

Смежные вопросы