X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fdebug%2Fprofiler.h;h=22d2c9a82c9fcb7df8545d16e7545d9ebb0720a3;hp=f2d5812da30befafb53914168eeb4237c2966b1c;hb=41363aed34382386f915f17c1a961750b4fdcb14;hpb=e7638f74d3e4869020a19dfa1cc700d52373f01c diff --git a/source/debug/profiler.h b/source/debug/profiler.h index f2d5812..22d2c9a 100644 --- a/source/debug/profiler.h +++ b/source/debug/profiler.h @@ -1,17 +1,12 @@ -/* $Id$ - -This file is part of libmspcore -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_DEBUG_PROFILER_H_ #define MSP_DEBUG_PROFILER_H_ #include #include #include -#include "../time/timedelta.h" +#include +#include +#include namespace Msp { namespace Debug { @@ -24,69 +19,60 @@ external profilers, but allows profiling of custom scopes and retrieving the profiling data at run time. An example usage could be showing realtime performance statistics of a game or a simulation. -See also class ProfilingScope. +Data can be recorded by creating a ProfilingScope object in the scope to be +profiled. Note: This is not thread-safe. To profile multiple threads, create a separate Profiler for each thread. */ -class Profiler +class Profiler: private NonCopyable { public: + struct CallInfo + { + Msp::Time::TimeStamp entry_time; + Msp::Time::TimeDelta duration; + }; + struct ScopeInfo { - unsigned calls; + Time::TimeStamp first_call; + unsigned calls = 0; Time::TimeDelta total_time; Time::TimeDelta self_time; Time::TimeDelta avg_time; - std::vector history; - unsigned hist_pos; + float calls_per_sec = 0; + std::vector history; + unsigned hist_pos = 0; + bool hist_full = false; std::map called_from; - - ScopeInfo(); }; private: - unsigned period; + unsigned period = 0; std::map scopes; - ProfilingScope *inner; + ProfilingScope *inner = nullptr; public: - Profiler(); - - /** - Sets the averaging period for timing data, measured in calls. Previous - average timings are cleared. - */ + /** Sets the averaging period for timing data, measured in calls. Previous + average timings are cleared. */ void set_period(unsigned p); - /** - Adds a scope without recording any calls to it. Useful if you might need to - access a scope before it has finished for the first time. - */ + /** Adds a scope without recording any calls to it. Useful if you might + need to access a scope before it has finished for the first time. */ void add_scope(const std::string &name); - /** - Changes the recorded innermost scope pointer and returns the old one. This - is used by ProfilingScope to track child time and should not be called - manually. - */ + /** Changes the recorded innermost scope pointer and returns the old one. + This is used by ProfilingScope to track child time and should not be called + manually. */ ProfilingScope *enter(ProfilingScope *ps); - /** - Records a call to a scope. You'll probably want to use a ProfilingScope - instead of calling this manually. - - @param sn Scope name - @param pn Parent scope name - @param t Time spent in the scope - @param ct Time spent in child scopes - */ - void record(const std::string &sn, const std::string &pn, const Time::TimeDelta &t, const Time::TimeDelta &ct); + /** Records the data from a ProfilingScope. It is not useful to call this + manually. */ + void record(const ProfilingScope &); - /** - Returns informations about a scope. - */ - const ScopeInfo &scope(const std::string &) const; + /** Returns informations about a scope. */ + const ScopeInfo &get_scope(const std::string &) const; }; } // namespace Debug