00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00033 #ifndef __vtkTimerLog_h
00034 #define __vtkTimerLog_h
00035
00036 #include "vtkObject.h"
00037
00038 #ifdef _WIN32
00039 #ifndef _WIN32_WCE
00040 #include <sys/types.h>
00041 #include <sys/timeb.h>
00042 #endif
00043 #else
00044 #include <time.h>
00045 #include <sys/time.h>
00046 #include <sys/types.h>
00047 #include <sys/times.h>
00048 #endif
00049
00050
00051 #ifndef _WIN32
00052 #include <unistd.h>
00053 #endif
00054
00055
00056 #ifndef NO_FD_SET
00057 # define SELECT_MASK fd_set
00058 #else
00059 # ifndef _AIX
00060 typedef long fd_mask;
00061 # endif
00062 # if defined(_IBMR2)
00063 # define SELECT_MASK void
00064 # else
00065 # define SELECT_MASK int
00066 # endif
00067 #endif
00068
00069
00070 #define VTK_LOG_EVENT_LENGTH 40
00071
00072
00073 typedef struct
00074 {
00075 double WallTime;
00076 int CpuTicks;
00077 char Event[VTK_LOG_EVENT_LENGTH];
00078 unsigned char Indent;
00079 } vtkTimerLogEntry;
00080
00081
00082 class VTK_COMMON_EXPORT vtkTimerLog : public vtkObject
00083 {
00084 public:
00085 static vtkTimerLog *New();
00086
00087 vtkTypeMacro(vtkTimerLog,vtkObject);
00088 void PrintSelf(ostream& os, vtkIndent indent);
00089
00091
00093 static void SetLogging(int v) {vtkTimerLog::Logging = v;}
00094 static int GetLogging() {return vtkTimerLog::Logging;}
00095 static void LoggingOn() {vtkTimerLog::SetLogging(1);}
00096 static void LoggingOff() {vtkTimerLog::SetLogging(0);}
00098
00100
00101 static void SetMaxEntries(int a);
00102 static int GetMaxEntries();
00104
00105
00107
00109 static void FormatAndMarkEvent(const char *EventString, ...);
00110
00112
00115 static void DumpLog(const char *filename);
00116
00118
00121 static void MarkStartEvent(const char *EventString);
00122 static void MarkEndEvent(const char *EventString);
00123
00124 static void DumpLogWithIndents(ostream *os, double threshold);
00125
00127
00129
00130 static int GetNumberOfEvents();
00131 static int GetEventIndent(int i);
00132 static double GetEventWallTime(int i);
00133 static const char* GetEventString(int i);
00135
00137 static void MarkEvent(const char *EventString);
00138
00141 static void ResetLog();
00142
00144 static void AllocateLog();
00145
00147 static void CleanupLog();
00148
00151 static double GetUniversalTime();
00152
00155 static double GetCPUTime();
00156
00158 void StartTimer();
00159
00161 void StopTimer();
00162
00165 double GetElapsedTime();
00166
00167 #ifdef VTK_WORKAROUND_WINDOWS_MANGLE
00168 # define GetTickCount GetCurrentTime
00169 #endif
00170
00173 VTK_LEGACY(static double GetCurrentTime());
00174
00175 #ifdef VTK_WORKAROUND_WINDOWS_MANGLE
00176 # undef GetTickCount
00177
00178 VTK_LEGACY(static double GetTickCount());
00179
00180 #endif
00181
00182 protected:
00183 vtkTimerLog() {this->StartTime=0; this->EndTime = 0;};
00184 virtual ~vtkTimerLog() { };
00185
00186 static vtkTimerLogEntry* GetEvent(int i);
00187
00188 static int Logging;
00189 static int Indent;
00190 static int MaxEntries;
00191 static int NextEntry;
00192 static int WrapFlag;
00193 static int TicksPerSecond;
00194 static vtkTimerLogEntry *TimerLog;
00195
00196 #ifdef _WIN32
00197 #ifndef _WIN32_WCE
00198 static timeb FirstWallTime;
00199 static timeb CurrentWallTime;
00200 #else
00201 static FILETIME FirstWallTime;
00202 static FILETIME CurrentWallTime;
00203 #endif
00204 #else
00205 static timeval FirstWallTime;
00206 static timeval CurrentWallTime;
00207 static tms FirstCpuTicks;
00208 static tms CurrentCpuTicks;
00209 #endif
00210
00211
00212
00213 double StartTime;
00214 double EndTime;
00215
00216
00217 static void DumpEntry(ostream& os, int index, double time, double deltatime,
00218 int tick, int deltatick, const char *event);
00219
00220
00221 private:
00222 vtkTimerLog(const vtkTimerLog&);
00223 void operator=(const vtkTimerLog&);
00224 };
00225
00226
00227
00228
00229
00230 #define vtkTimerLogMacro(string) \
00231 { \
00232 vtkTimerLog::FormatAndMarkEvent("Mark: In %s, line %d, class %s: %s", \
00233 __FILE__, __LINE__, this->GetClassName(), string); \
00234 }
00235
00236 #endif