C++ 获取 std::chrono::duration 的周期

Sor*_*rko 3 c++ c++11 c++-chrono

我正在玩 std::chrono 。当我做一些测试时,我想知道是否可以获得用于构造 std::chrono::duration 的比率,因为我想打印它。

这里有一些代码来显示我到底想要做什么:

您应该能够通过添加-std=c++11标志在 Windows 和 Linux (g++) 上编译它。这个小示例代码应该测量您的机器达到最大 int 值所需的时间cout

主程序

#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;
}
Run Code Online (Sandbox Code Playgroud)

停止计时.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
Run Code Online (Sandbox Code Playgroud)

实际样本输出

count to max of int ...
finished.

It took me 81.6503 Seconds.
            81650329344
            81650331344
Run Code Online (Sandbox Code Playgroud)

目标样本输出

count to max of int ...
finished.

It took me 81.6503 Seconds.
            81650329344 (1/1000000000)sekonds 
            81650331344
Run Code Online (Sandbox Code Playgroud)

std::ratio<1,1000000000>即使我不知道我用哪个时间段来创建 stopchrono 对象,如何从返回的持续时间中获取已使用的时间段?这可能吗?

Meh*_*olf 5

该类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;
Run Code Online (Sandbox Code Playgroud)

另请参阅此工作示例,它打印经过的时间和秒数比率。