diff base/Profiler.h @ 0:fc9323a41f5a

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