00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef TEUCHOS_TIMEMONITOR_H
00030 #define TEUCHOS_TIMEMONITOR_H
00031
00039 #include "Teuchos_ConfigDefs.hpp"
00040 #include "Teuchos_Time.hpp"
00041 #include "Teuchos_RefCountPtr.hpp"
00042 #include "Teuchos_Array.hpp"
00043
00044 #define TEUCHOS_TIMER(funcName, strName) \
00045 static Teuchos::Time& funcName() \
00046 {static Teuchos::RefCountPtr<Time> rtn = \
00047 Teuchos::TimeMonitor::getNewTimer(strName); return *rtn;}
00048
00049 namespace Teuchos
00050 {
00051
00052 using std::string;
00053
00063 class TimeMonitor
00064 {
00065 public:
00066
00068 TimeMonitor(Time& timer)
00069 : timer_(timer), isRoot_(!timer.isRunning())
00070 {
00071 if (isRoot_) timer_.start();
00072 }
00073
00075 inline ~TimeMonitor()
00076 {
00077 if (isRoot_) timer_.stop();
00078 }
00079
00082 static void summarize();
00083
00086 static RefCountPtr<Time> getNewTimer(const string& name);
00087 private:
00088
00089 Time& timer_;
00090 bool isRoot_;
00091
00093 static void gatherTimings(const Array<double>& timings,
00094 Array<double>& minTime,
00095 Array<double>& avgTime,
00096 Array<double>& maxTime);
00097
00098 static Array<RefCountPtr<Time> > timers_;
00099 };
00100
00101 }
00102 #endif