X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fdebug%2Fprofiler.h;h=22d2c9a82c9fcb7df8545d16e7545d9ebb0720a3;hp=5ec8f3f1fcafa5dae8ebe4508a5b02abaeb7e1f3;hb=41363aed34382386f915f17c1a961750b4fdcb14;hpb=27efc167cb10ee03c1d2a6711dd149d1093179c8 diff --git a/source/debug/profiler.h b/source/debug/profiler.h index 5ec8f3f..22d2c9a 100644 --- a/source/debug/profiler.h +++ b/source/debug/profiler.h @@ -4,7 +4,9 @@ #include #include #include +#include #include +#include namespace Msp { namespace Debug { @@ -17,61 +19,59 @@ 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 the data from a ProfilingScope. It is not useful to call this manually. */ void record(const ProfilingScope &); - /** - Returns informations about a scope. - */ + /** Returns informations about a scope. */ const ScopeInfo &get_scope(const std::string &) const; };