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 #include <iostream>
00044
00045 #define TEUCHOS_TIMER(funcName, strName) \
00046 static Teuchos::Time& funcName() \
00047 {static Teuchos::RefCountPtr<Time> rtn = \
00048 Teuchos::TimeMonitor::getNewTimer(strName); return *rtn;}
00049
00050 namespace Teuchos
00051 {
00061 class TimeMonitor
00062 {
00063 public:
00064
00066 TimeMonitor(Time& timer, bool reset=false)
00067 : timer_(timer), isRoot_(!timer.isRunning())
00068 {
00069 if (isRoot_) timer_.start(reset);
00070 }
00071
00073 inline ~TimeMonitor()
00074 {
00075 if (isRoot_) timer_.stop();
00076 }
00077
00080 static void summarize(ostream &out=std::cout);
00081
00084 static RefCountPtr<Time> getNewTimer(const string& name);
00085 private:
00086
00087 Time& timer_;
00088 bool isRoot_;
00089
00091 static void gatherTimings(const Array<double>& timings,
00092 Array<double>& minTime,
00093 Array<double>& avgTime,
00094 Array<double>& maxTime);
00095
00096 static Array<RefCountPtr<Time> > timers_;
00097 };
00098
00099 }
00100 #endif