Branch data Line data Source code
1 : : #include <cstdio>
2 : : #include "CpuTimer.hpp"
3 : :
4 : : #include "CubitMessage.hpp"
5 : :
6 : : // Added by Cat for WIN32 port
7 : : #ifndef _WIN32
8 : : #include <sys/param.h>
9 : : #include <sys/times.h>
10 : : #endif
11 : :
12 : :
13 : : #include <time.h>
14 : : #ifdef SOLARIS
15 : : #include <unistd.h>
16 : : #endif
17 : :
18 : : #ifndef _WIN32
19 : : #ifndef HZ
20 : : #ifdef CLK_TCK
21 : : #define HZ CLK_TCK
22 : : #else
23 : : #define HZ 60
24 : : #endif
25 : : #endif
26 : : #else
27 : : #define HZ CLOCKS_PER_SEC
28 : : #endif
29 : :
30 : :
31 : :
32 : : // Added by Cat for WIN32 port
33 : : #ifdef _WIN32
34 : : struct tms {
35 : : clock_t tms_utime; /* user time */
36 : : clock_t tms_stime; /* system time */
37 : : clock_t tms_cutime; /* user time, children */
38 : : clock_t tms_cstime; /* system time, children */
39 : : };
40 : :
41 : : #include <windows.h>
42 : :
43 : : #endif
44 : :
45 : :
46 : 5574 : CpuTimer::CpuTimer()
47 : : {
48 : : tms current;
49 : :
50 : : // Added by Cat for WIN32 port
51 : : #ifdef _WIN32
52 : : nt_times(¤t);
53 : : wallTimeInitial = clock();
54 : : wallTime = wallTimeInitial;
55 : : #else
56 : 5574 : gettimeofday(&wallTimeInitial, NULL);
57 : 5574 : wallTime = wallTimeInitial;
58 : 5574 : times( ¤t );
59 : : #endif
60 : :
61 : : // Store current value of cpu time
62 : 5574 : cpu = current.tms_utime +
63 : 5574 : current.tms_stime +
64 : 5574 : current.tms_cutime +
65 : 5574 : current.tms_cstime;
66 : 5574 : cpuInitial = cpu;
67 : 5574 : }
68 : :
69 : : // Return time values
70 : :
71 : : double
72 : 0 : CpuTimer::cpu_secs()
73 : : {
74 : : tms current;
75 : :
76 : : // Added by Cat for WIN32 port
77 : : #ifdef _WIN32
78 : : nt_times(¤t);
79 : : #else
80 : 0 : times( ¤t );
81 : : #endif
82 : :
83 : 0 : time_t cpu_now = current.tms_utime +
84 : 0 : current.tms_stime +
85 : 0 : current.tms_cutime +
86 : 0 : current.tms_cstime;
87 : 0 : time_t delta = cpu_now - cpu;
88 : 0 : cpu = cpu_now;
89 : : #ifdef _WIN32
90 : : if( delta == 0 )
91 : : delta = 1;
92 : : #endif
93 : 0 : return (double) delta / HZ;
94 : : }
95 : :
96 : : double
97 : 0 : CpuTimer::clock_secs()
98 : : {
99 : : double elapsed_time;
100 : : #ifdef _WIN32
101 : : clock_t current;
102 : : current = clock();
103 : : elapsed_time = double( current - wallTime );
104 : : elapsed_time = elapsed_time / HZ;
105 : :
106 : : wallTime = current;
107 : : #else
108 : : timeval current;
109 : 0 : gettimeofday( ¤t, NULL );
110 : 0 : double prev_time = wallTime.tv_sec;
111 : 0 : prev_time += double( wallTime.tv_usec ) / 1000000.0;
112 : :
113 : 0 : elapsed_time = current.tv_sec;
114 : 0 : elapsed_time += double( current.tv_usec ) / 1000000.0;
115 : 0 : elapsed_time = elapsed_time - prev_time;
116 : :
117 : 0 : wallTime = current;
118 : : #endif
119 : :
120 : 0 : return elapsed_time;
121 : : }
122 : :
123 : : double
124 : 0 : CpuTimer::elapsed(bool wall_time)
125 : : {
126 [ # # ]: 0 : if( wall_time )
127 : : {
128 : : double elapsed;
129 : : #ifdef _WIN32
130 : : clock_t current;
131 : : current = clock();
132 : : elapsed = double( current - wallTimeInitial);
133 : : elapsed = elapsed / HZ;
134 : : #else
135 : : double current_time;
136 : : timeval current;
137 : 0 : gettimeofday( ¤t, NULL );
138 : : double initial_time;
139 : 0 : initial_time = wallTimeInitial.tv_sec;
140 : 0 : initial_time += double(wallTimeInitial.tv_usec) / 1000000.0;
141 : 0 : current_time = current.tv_sec;
142 : 0 : current_time += double( current.tv_usec ) / 1000000.0;
143 : :
144 : 0 : elapsed = current_time - initial_time;
145 : : #endif
146 : 0 : return elapsed;
147 : : }
148 : : else
149 : : {
150 : : tms current;
151 : :
152 : : // Added by Cat for WIN32 port
153 : : #ifdef _WIN32
154 : : nt_times(¤t);
155 : : #else
156 : 0 : times( ¤t );
157 : : #endif
158 : : // Store totals
159 : :
160 : 0 : time_t cpu_now = current.tms_utime +
161 : 0 : current.tms_stime +
162 : 0 : current.tms_cutime +
163 : 0 : current.tms_cstime;
164 : 0 : time_t elapsed = cpu_now - cpuInitial;
165 : 0 : return (double) elapsed / HZ;
166 : : }
167 : : }
168 : :
169 : :
170 : : // Added by Cat for WIN32 port
171 : : #ifdef _WIN32
172 : :
173 : : void CpuTimer::nt_times(tms *sys)
174 : : {
175 : : HANDLE current_process = GetCurrentProcess();
176 : :
177 : : FILETIME ftCreation, ftExit, ftKernel, ftUser;
178 : : GetProcessTimes(current_process, &ftCreation, &ftExit, &ftKernel, &ftUser);
179 : :
180 : : //kernel and user times are amounts of time rather than an actual time period.
181 : : //The value in the FILETIME structure is expressed in 100-nanosecond units.
182 : : //Divide by 10 million to convert to seconds.
183 : :
184 : : __int64 i64 = *((__int64 *) &ftKernel);
185 : : double dw_kernel = (i64 / 10000000.0);
186 : :
187 : : i64 = *((__int64 *) &ftUser);
188 : : double dw_user = (i64 / 10000000.0);
189 : :
190 : : sys->tms_utime = dw_user*HZ;
191 : : sys->tms_stime = dw_kernel*HZ;
192 : : sys->tms_cutime = 0;
193 : : sys->tms_cstime = 0;
194 : : //PRINT_DEBUG( CUBIT_DEBUG_3,"clock returned %d\n", sys->tms_stime );
195 : : }
196 : : #endif
|