412a7ac50532491375b3c5004337d27166168c09
[occt.git] / src / OSD / OSD_Timer.cxx
1 // Created on: 1992-12-04
2 // Created by: Didier PIFFAULT , Mireille MERCIEN
3 // Copyright (c) 1992-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 // Update: J.P. TIRAULT Sep,1993
18 //         On heterogeneous platforms we need to use the 
19 //         system call gettimeofday. This function is portable and give us
20 //         elapsed time in seconds and microseconds.
21
22 #include <OSD_Timer.hxx>
23
24 #ifndef _WIN32
25
26 //---------- No Windows NT Systems ----------------------------------
27
28 #include <sys/time.h>
29
30 //=======================================================================
31 //function : GetWallClockTime
32 //purpose  : Get current time in seconds with system-defined precision
33 //=======================================================================
34
35 static inline Standard_Real GetWallClockTime ()
36 {
37   struct timeval tv;
38   // use time of first call as base for computing total time,
39   // to avoid loss of precision due to big values of tv_sec (counted since 1970)
40   static time_t startSec = (gettimeofday (&tv, NULL) ? 0 : tv.tv_sec);
41   return gettimeofday (&tv, NULL) ? 0. : (tv.tv_sec - startSec) + 0.000001 * tv.tv_usec;
42 }
43
44 #else
45 //-------------------  Windows NT  ------------------
46
47 #define STRICT
48 #include <windows.h>
49
50 //=======================================================================
51 //function : GetWallClockTime
52 //purpose  : Get current time in seconds with system-defined precision
53 //=======================================================================
54
55 static inline Standard_Real GetWallClockTime ()
56 {
57   // compute clock frequence on first call
58   static LARGE_INTEGER freq;
59   static BOOL isOk = QueryPerformanceFrequency (&freq);
60
61   LARGE_INTEGER time;
62   return isOk && QueryPerformanceCounter (&time) ? 
63          (Standard_Real)time.QuadPart / (Standard_Real)freq.QuadPart :
64 #ifndef OCCT_UWP
65          0.001 * GetTickCount();
66 #else
67          0.001 * GetTickCount64();
68 #endif
69 }
70
71 #endif /* _WIN32 */
72
73 // ====================== PLATFORM-INDEPENDENT PART ========================
74
75 //=======================================================================
76 //function : OSD_Timer
77 //purpose  : 
78 //=======================================================================
79
80 OSD_Timer::OSD_Timer()
81 {
82   TimeStart = TimeCumul = 0.;
83 }
84
85 //=======================================================================
86 //function : Compute
87 //purpose  : Calcul les Heures,Minutes,Secondes,Millisecondes a partir
88 //           de deux variables input qui sont:
89 //           TimeCumulInt : Contient un periode de temps exprimee en secondes,
90 //           MicroCumulInt: Contient cette meme periode exprimee en 
91 //                       microsecondes.
92 //=======================================================================
93
94 static void Compute (Standard_Real     Time,
95                      Standard_Integer& heure,
96                      Standard_Integer& minut,
97                      Standard_Real&    second) 
98 {
99   Standard_Integer sec = (Standard_Integer)Time;
100   heure = sec / 3600;
101   minut = (sec - heure * 3600) / 60;
102   second = Time - heure * 3600 - minut * 60;
103 }
104
105 //=======================================================================
106 //function : Reset
107 //purpose  :
108 //=======================================================================
109
110 void OSD_Timer::Reset (const Standard_Real theTimeElapsedSec)
111 {
112   TimeStart = 0.0;
113   TimeCumul = theTimeElapsedSec;
114   OSD_Chronometer::Reset();
115 }
116
117 //=======================================================================
118 //function : Reset
119 //purpose  : 
120 //=======================================================================
121
122 void OSD_Timer::Reset ()
123 {
124   TimeStart = TimeCumul = 0.;
125   OSD_Chronometer::Reset();
126 }
127
128 //=======================================================================
129 //function : Show
130 //purpose  : 
131 //=======================================================================
132
133 void OSD_Timer::Show() const
134 {
135   Show (cout);
136 }
137
138 //=======================================================================
139 //function : ElapsedTime
140 //purpose  :
141 //=======================================================================
142
143 Standard_Real OSD_Timer::ElapsedTime() const
144 {
145   if (Stopped)
146   {
147     return TimeCumul;
148   }
149
150   return TimeCumul + GetWallClockTime() - TimeStart;
151 }
152
153 //=======================================================================
154 //function : Show
155 //purpose  : 
156 //=======================================================================
157
158 void OSD_Timer::Show (Standard_Real&    theSeconds,
159                       Standard_Integer& theMinutes,
160                       Standard_Integer& theHours,
161                       Standard_Real&    theCPUtime) const
162 {
163   const Standard_Real aTimeCumul = Stopped
164                                  ? TimeCumul
165                                  : TimeCumul + GetWallClockTime() - TimeStart;
166   Compute (aTimeCumul, theHours, theMinutes, theSeconds);
167   OSD_Chronometer::Show (theCPUtime);
168 }
169
170 //=======================================================================
171 //function : Show
172 //purpose  : 
173 //=======================================================================
174
175 void OSD_Timer::Show (Standard_OStream& os) const
176 {
177   const Standard_Real aTimeCumul = Stopped
178                                  ? TimeCumul
179                                  : TimeCumul + GetWallClockTime() - TimeStart;
180
181   Standard_Integer anHours, aMinutes;
182   Standard_Real    aSeconds;
183   Compute (aTimeCumul, anHours, aMinutes, aSeconds);
184
185   std::streamsize prec = os.precision (12);
186   os << "Elapsed time: " << anHours  << " Hours "   <<
187                             aMinutes << " Minutes " <<
188                             aSeconds << " Seconds " << endl;
189   OSD_Chronometer::Show(os);
190   os.precision (prec);
191 }
192
193 //=======================================================================
194 //function : Stop
195 //purpose  : 
196 //=======================================================================
197
198 void OSD_Timer::Stop ()
199 {
200   if (!Stopped) {
201     TimeCumul += GetWallClockTime () - TimeStart;
202     OSD_Chronometer::Stop();
203   }
204 //  else cout << "WARNING: OSD_Timer already Stopped !\n";
205 }
206
207 //=======================================================================
208 //function : Start
209 //purpose  : 
210 //=======================================================================
211
212 void OSD_Timer::Start()
213 {
214   if (Stopped) {
215     TimeStart = GetWallClockTime();
216     OSD_Chronometer::Start();
217   }
218 //  else cout << "WARNING: OSD_Timer already Running !\n";
219 }