source: GTP/trunk/Lib/Vis/Preprocessing/src/havran/timer.cpp @ 2582

Revision 2582, 4.8 KB checked in by bittner, 16 years ago (diff)

Havran Ray Caster compiles and links, but still does not work

Line 
1// ===================================================================
2// $Id: timer.cpp,v $
3//
4// timer.cpp
5//     Timing for running process
6//
7// REPLACEMENT_STRING
8//
9// Copyright by Vlastimil Havran, 2007 - email to "vhavran AT seznam.cz"
10// Windows time measuring added by Jaroslav Krivanek, October 2003.
11
12// GOLEM headers
13#include "timer.h"
14
15// ------------------------------------------------------
16// Use ftime instead of time, see > man ftime
17#define _USE_FTIME_CALL
18
19// standard headers
20#include <ctime>
21#ifdef __UNIX__
22
23#include <sys/time.h>
24#include <sys/resource.h>
25
26#ifdef _USE_FTIME_CALL
27#include  <sys/timeb.h>
28#endif // _USE_FTIME_CALL
29
30#endif // __UNIX__
31#ifdef _MSC_VER
32#include <windows.h>
33#include <sys/types.h>
34#include <sys/timeb.h>
35#endif // _MSC_VER
36
37namespace GtpVisibilityPreprocessor {
38
39
40// Staic variable
41bool
42CTimer::initTimingCalled = false;
43
44// The following are not static's in the CTimer class to prevent
45// #including <windows.h> into the "timer.h" header.
46#ifdef  _MSC_VER
47/// true if the performance timer works under windows
48static BOOL hasHRTimer;
49/// frequency of the performance timer under windows
50static LARGE_INTEGER hrFreq;
51#endif // MSC_VER
52
53void
54CTimer::_initTiming()
55{
56#ifdef  _MSC_VER
57  hasHRTimer = QueryPerformanceFrequency(&hrFreq);
58#endif
59  initTimingCalled = true;
60}
61
62void
63CTimer::Reset()
64{
65  // Real times in seconds
66#ifdef _USE_FTIME_CALL
67  timeb beg;
68  ftime(&beg);
69  lastRealTime = (double)(beg.time + 0.001 * beg.millitm); 
70#else //  _USE_FTIME_CALL
71  time_t beg;
72  time(&beg);
73  lastRealTime = (double)beg;
74#endif // _USE_FTIME_CALL
75 
76  lastUserTime   = 0.0;
77  lastSystemTime = 0.0;
78
79  realTime   = 0.0;
80  userTime   = 0.0;
81  systemTime = 0.0;
82
83  countStop = 0;
84  running = false;
85
86#ifdef __UNIX__
87  // Timing in OS UNIX
88  begrusage.ru_utime.tv_usec = begrusage.ru_utime.tv_sec =
89  begrusage.ru_stime.tv_usec = begrusage.ru_stime.tv_sec = 0L;
90  endrusage = begrusage;
91#endif // __UNIX__
92}
93
94void
95CTimer::_start() const
96{
97  if (running)
98    return; // timer is already running
99
100  // Measure the real time
101#ifdef _USE_FTIME_CALL
102  timeb beg;
103  ftime(&beg);
104  lastRealTime = (double)(beg.time + 0.001 * beg.millitm); 
105#else //  _USE_FTIME_CALL
106  time_t beg;
107  time(&beg);
108  lastRealTime = (double)beg;
109#endif //  _USE_FTIME_CALL
110
111  // Measure the real and system time
112#ifdef __UNIX__
113  // Measure under UNIX
114  struct rusage begrusage;
115  getrusage(RUSAGE_SELF, &begrusage);
116
117  lastUserTime = (double)begrusage.ru_utime.tv_sec +
118                     1e-6 * begrusage.ru_utime.tv_usec;
119
120  lastSystemTime = (double)begrusage.ru_stime.tv_sec +
121                           1e-6 * begrusage.ru_stime.tv_usec;
122#endif // __UNIX__
123
124#ifdef  _MSC_VER
125  // Mesure under Windows
126  if (hasHRTimer) {
127    LARGE_INTEGER counter;
128    QueryPerformanceCounter(&counter);
129    lastUserTime = (double)counter.QuadPart / (double)hrFreq.QuadPart;
130    lastSystemTime = 0;   
131  }
132  else {
133    static struct _timeb mtime;
134    _ftime(&mtime);
135    lastUserTime   = (double)mtime.time + 1e-3 * mtime.millitm;
136    lastSystemTime = 0;
137  }
138#endif
139  // Begin trace.
140  running = true;
141}
142
143void
144CTimer::_stop() const
145{
146  if (!running)
147    return; // timer is not running
148 
149  // Begin trace.
150#ifdef _USE_FTIME_CALL
151  timeb end;
152  ftime(&end);
153  realTime += (double)(end.time + 0.001 * end.millitm) - lastRealTime; 
154#else //  _USE_FTIME_CALL
155  time_t end;
156  time(&end);
157  realTime += (double)end - lastRealTime;
158#endif //  _USE_FTIME_CALL
159
160#ifdef __UNIX__
161  // timing in unix OS
162  getrusage(RUSAGE_SELF, &endrusage);
163
164  userTime += (double)endrusage.ru_utime.tv_sec +
165          1e-6 * endrusage.ru_utime.tv_usec -
166          lastUserTime;
167
168  systemTime += (double)endrusage.ru_stime.tv_sec +
169          1e-6 * endrusage.ru_stime.tv_usec -
170          lastSystemTime;
171#endif // __UNIX__
172
173#ifdef  _MSC_VER
174  // Mesure under Windows
175  if (hasHRTimer) {
176    LARGE_INTEGER counter;
177    QueryPerformanceCounter(&counter);
178    userTime += (double)counter.QuadPart / (double)hrFreq.QuadPart -
179      lastUserTime;
180    systemTime = 0;
181   }
182  else {
183    static struct _timeb mtime;
184    _ftime(&mtime);
185    userTime   += (double)mtime.time + 1e-3 * mtime.millitm -
186      lastUserTime;
187    systemTime = 0;
188  }
189#endif
190
191  running = false;
192  countStop++;
193}
194
195// returns the real time measured by timer in seconds
196double
197CTimer::RealTime() const
198{
199  if (running) {
200    _stop();
201    _start();
202  }
203  return realTime;
204}
205
206// returns the user time measured by timer in seconds
207double
208CTimer::UserTime() const
209{
210  if (running) {
211    _stop();
212    _start();
213  }
214  return userTime;
215}
216
217// returns the user+system time measured by timer in seconds
218double
219CTimer::SystemTime() const
220{
221  if (running) {
222    _stop();
223    _start();
224  }
225  return systemTime;
226}
227
228}
Note: See TracBrowser for help on using the repository browser.