C++11: Zeitdauer messen



  • Wie messe ich mit C++11 möglichts genau, wie lange für das Ausführen eines Codestückes gebraucht wird?



  • Das sollte grob beschrieben in etwa so funktionieren:

    auto Start = std::chrono::high_resolution_clock.now();
    doSomething();
    auto Stop = std::chrono::high_resolution_clock.now();
    auto duration = Stop - Start;
    


  • Danke. Und wie gebe ich "duration" dann über cout aus?



  • #ifndef STOPWATCH_HPP
    #define STOPWATCH_HPP
    
    #include <chrono>
    
    template <typename Clock = std::chrono::steady_clock>
    class stopwatch
    {
    public:
    	typedef Clock clock;
    	typedef typename clock::time_point time_point;
    	typedef typename clock::duration duration;
    
    private:
    	time_point last_;
    
    public:
    	stopwatch()
    		: last_(clock::now())
    	{}
    
    	void reset()
    	{
    		*this = stopwatch();
    	}
    
    	time_point now() const
    	{
    		return clock::now();
    	}
    
    	duration elapsed() const
    	{
    		return now() - last_;
    	}
    
    	duration tick()
    	{
    		time_point dummy;
    		return tick(dummy);
    	}
    
    	duration tick(time_point& now_)
    	{
    		now_ = now();
    		auto elapsed = now_ - last_;
    		last_ = now_;
    		return elapsed;
    	}
    };
    
    typedef stopwatch<> default_stopwatch;
    
    template <typename T, typename Rep, typename Period>
    T duration_cast(const std::chrono::duration<Rep, Period>& duration)
    {
    	return duration.count() * static_cast<T>(Period::num) / static_cast<T>(Period::den);
    }
    
    #endif
    
    #inlcude <iostream>
    
    int main()
    {
        default_stopwatch sw;
        // Codestück
        auto duration = sw.elapsed();
        auto seconds = duration_cast<double>(duration);
        std::cout << "Seconds: " << seconds << '\n';
    }
    

    Das ist zumindest C++11, für möglichst genau kannst du als Template-Parameter der stopwatch std::high_resolution_clock angeben, aber wie genau die ist ist nicht definiert. Du kannst allerdings auch einfach deine eigene clock implementieren die das TrivialClock concept erfüllt. http://en.cppreference.com/w/cpp/concept/TrivialClock

    http://en.cppreference.com/w/cpp/header/chrono



  • fsdf schrieb:

    Danke. Und wie gebe ich "duration" dann über cout aus?

    Nehmen wir an du möchtest die Dauer in Nanosekunden haben:

    uning namespace std;
    cout << "Duration in ns: " << crono::nanoseconds(duration).count() << '\n';
    


  • cooky451 schrieb:

    auto seconds = duration_cast<double>(duration);
    

    Müsste das nicht eher so heißen:

    auto seconds = chrono::duration_cast<chrono::seconds> (duration).count();
    

    ?

    Kann man wirklich eine duration einfach in einen double casten und das sind dann immer Sekunden?



  • cooky451 schrieb:

    void reset()
    {
    	*this = stopwatch();
    }
    

    Das Idiom gefällt mir! 🙂


  • Mod

    Anstatt das von Hand zu messen, willst du vermutlich eher einen Profiler benutzen. Die können Performancemessungen viel besser.



  • SeppJ schrieb:

    Anstatt das von Hand zu messen, willst du vermutlich eher einen Profiler benutzen. Die können Performancemessungen viel besser.

    Hat VC++2013 Express einen Profiler?



  • TNA schrieb:

    Kann man wirklich eine duration einfach in einen double casten und das sind dann immer Sekunden?

    Nein, die Funktion ist von mir. Mir fällt nur kein besserer Name ein als duration_cast. 😉



  • stimmt, aber schrieb:

    SeppJ schrieb:

    Anstatt das von Hand zu messen, willst du vermutlich eher einen Profiler benutzen. Die können Performancemessungen viel besser.

    Hat VC++2013 Express einen Profiler?

    nimm halt irgendein kostenloses profilingtool. ich empfehle verysleepy.


Anmelden zum Antworten