#include <map>
#include <string>
#include <vector>
+#include <msp/core/noncopyable.h>
#include <msp/time/timedelta.h>
#include <msp/time/timestamp.h>
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
struct ScopeInfo
{
Time::TimeStamp first_call;
- unsigned calls;
+ unsigned calls = 0;
Time::TimeDelta total_time;
Time::TimeDelta self_time;
Time::TimeDelta avg_time;
- float calls_per_sec;
+ float calls_per_sec = 0;
std::vector<CallInfo> history;
- unsigned hist_pos;
- bool hist_full;
+ unsigned hist_pos = 0;
+ bool hist_full = false;
std::map<std::string, unsigned> called_from;
-
- ScopeInfo();
};
private:
- unsigned period;
+ unsigned period = 0;
std::map<std::string, ScopeInfo> 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;
};