lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: This is a modified version of a source file from the lbajardsilogic@0: Rosegarden MIDI and audio sequencer and notation editor. lbajardsilogic@0: This file copyright 2000-2006 Chris Cannam, Guillaume Laurent, lbajardsilogic@0: and QMUL. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: #ifndef _PROFILER_H_ lbajardsilogic@0: #define _PROFILER_H_ lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: //#include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@191: #include "system/System.h" lbajardsilogic@191: lbajardsilogic@0: #include "RealTime.h" lbajardsilogic@0: lbajardsilogic@0: //#define NO_TIMING 1 lbajardsilogic@0: lbajardsilogic@0: #define WANT_TIMING 1 lbajardsilogic@0: lbajardsilogic@0: #ifdef NDEBUG lbajardsilogic@0: #ifndef WANT_TIMING lbajardsilogic@0: #define NO_TIMING 1 lbajardsilogic@0: #endif lbajardsilogic@0: #endif lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Profiling classes lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * The class holding all profiling data lbajardsilogic@0: * lbajardsilogic@0: * This class is a singleton lbajardsilogic@0: */ lbajardsilogic@0: class Profiles lbajardsilogic@0: { lbajardsilogic@0: public: lbajardsilogic@0: static Profiles* getInstance(); lbajardsilogic@0: ~Profiles(); lbajardsilogic@0: lbajardsilogic@0: void accumulate(const char* id, clock_t time, RealTime rt); lbajardsilogic@0: void dump() const; lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: Profiles(); lbajardsilogic@0: lbajardsilogic@0: typedef std::pair TimePair; lbajardsilogic@0: typedef std::pair ProfilePair; lbajardsilogic@0: typedef std::map ProfileMap; lbajardsilogic@0: typedef std::map LastCallMap; lbajardsilogic@0: typedef std::map WorstCallMap; lbajardsilogic@0: ProfileMap m_profiles; lbajardsilogic@0: LastCallMap m_lastCalls; lbajardsilogic@0: WorstCallMap m_worstCalls; lbajardsilogic@0: lbajardsilogic@0: static Profiles* m_instance; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #ifndef NO_TIMING lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Profile point instance class. Construct one of these on the stack lbajardsilogic@0: * at the start of a function, in order to record the time consumed lbajardsilogic@0: * within that function. The profiler object should be effectively lbajardsilogic@0: * optimised out if NO_TIMING is defined, so any overhead in a release lbajardsilogic@0: * build should be negligible so long as you remember to define that. lbajardsilogic@0: */ lbajardsilogic@0: class Profiler lbajardsilogic@0: { lbajardsilogic@0: public: lbajardsilogic@0: /** lbajardsilogic@0: * Create a profile point instance that records time consumed lbajardsilogic@0: * against the given profiling point name. If showOnDestruct is lbajardsilogic@0: * true, the time consumed will be printed to stderr when the lbajardsilogic@0: * object is destroyed; otherwise, only the accumulated, mean and lbajardsilogic@0: * worst-case times will be shown when the program exits or lbajardsilogic@0: * Profiles::dump() is called. lbajardsilogic@0: */ lbajardsilogic@0: Profiler(const char *name, bool showOnDestruct = false); lbajardsilogic@0: ~Profiler(); lbajardsilogic@0: lbajardsilogic@0: void update() const; lbajardsilogic@0: lbajardsilogic@0: protected: lbajardsilogic@0: const char* m_c; lbajardsilogic@0: clock_t m_startCPU; lbajardsilogic@0: RealTime m_startTime; lbajardsilogic@0: bool m_showOnDestruct; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #else lbajardsilogic@0: lbajardsilogic@0: class Profiler lbajardsilogic@0: { lbajardsilogic@0: public: lbajardsilogic@0: Profiler(const char *, bool) { } lbajardsilogic@0: ~Profiler() { } lbajardsilogic@0: lbajardsilogic@0: void update() { } lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #endif lbajardsilogic@0: lbajardsilogic@0: #endif