"Fossies" - the Fresh Open Source Software Archive 
Member "bonnie++-1.04/bon_time.cpp" (8 Jan 2003, 9329 Bytes) of package /linux/privat/bonnie++_1.04.tgz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "bon_time.cpp" see the
Fossies "Dox" file reference documentation.
1
2 using namespace std;
3
4 #include <sys/time.h>
5 #ifdef OS2
6 #define INCL_DOSFILEMGR
7 #define INCL_BASE
8 #include <os2.h>
9 #include "os2-perfutil.h"
10 /*
11 Convert 8-byte (low, high) time value to double
12 */
13 #define LL2F(high, low) (4294967296.0*(high)+(low))
14 #else
15 #include <unistd.h>
16 #include <sys/resource.h>
17 #endif
18 #include "bon_time.h"
19 #include <time.h>
20 #include <string.h>
21
22 #ifndef NON_UNIX
23 #include "conf.h"
24 #endif
25
26 #ifdef HAVE_ALGORITHM
27 #include <algorithm>
28 #else
29
30 #ifdef HAVE_ALGO
31 #include <algo>
32 #else
33 #ifdef HAVE_ALGO_H
34 #include <algo.h>
35 #else
36 #define min(XX,YY) ((XX) < (YY) ? (XX) : (YY))
37 #define max(XX,YY) ((XX) > (YY) ? (XX) : (YY))
38 #endif
39 #endif
40
41 #endif
42
43 #define TIMEVAL_TO_DOUBLE(XX) (double((XX).tv_sec) + double((XX).tv_usec) / 1000000.0)
44
45 void BonTimer::timestamp()
46 {
47 m_last_timestamp = get_cur_time();
48 m_last_cpustamp = get_cpu_use();
49 }
50
51 double
52 BonTimer::time_so_far()
53 {
54 return get_cur_time() - m_last_timestamp;
55 }
56
57 double
58 BonTimer::cpu_so_far()
59 {
60 return get_cpu_use() - m_last_cpustamp;
61 }
62
63 double
64 BonTimer::get_cur_time()
65 {
66 #ifdef OS2
67 ULONG count = 0;
68 ULONG rc = DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &count, sizeof(count));
69 if(rc)
70 return 0.0;
71 return double(count)/1000.0;
72 #else
73 struct timeval tp;
74
75 if (gettimeofday(&tp, static_cast<struct timezone *>(NULL)) == -1)
76 io_error("gettimeofday", true);
77 return TIMEVAL_TO_DOUBLE(tp);
78 #endif
79 }
80
81 double
82 BonTimer::get_cpu_use()
83 {
84 #ifdef OS2
85 double busy_val, busy_val_prev;
86 double intr_val, intr_val_prev;
87 CPUUTIL CPUUtil;
88
89 ULONG rc = DosPerfSysCall(CMD_KI_RDCNT,(ULONG) &CPUUtil,0,0);
90 if(rc)
91 io_error("times", true);
92 return LL2F(CPUUtil.ulBusyHigh, CPUUtil.ulBusyLow)
93 + LL2F(CPUUtil.ulIntrHigh, CPUUtil.ulIntrLow);
94 #else
95 struct rusage res_usage;
96
97 getrusage(RUSAGE_SELF, &res_usage);
98 return TIMEVAL_TO_DOUBLE(res_usage.ru_utime) + TIMEVAL_TO_DOUBLE(res_usage.ru_stime);
99 #endif
100 }
101
102 void BonTimer::get_delta_t(tests_t test)
103 {
104 m_delta[test].Elapsed = time_so_far();
105 m_delta[test].CPU = cpu_so_far();
106 timestamp();
107 }
108
109 void BonTimer::get_delta_report(report_s &rep)
110 {
111 rep.EndTime = get_cur_time();
112 rep.CPU = cpu_so_far();
113 timestamp();
114 }
115
116 void BonTimer::add_delta_report(report_s &rep, tests_t test)
117 {
118 if(m_delta[test].CPU == 0.0)
119 {
120 m_delta[test].FirstStart = rep.StartTime;
121 m_delta[test].LastStop = rep.EndTime;
122 }
123 else
124 {
125 m_delta[test].FirstStart = min(m_delta[test].FirstStart, rep.StartTime);
126 m_delta[test].LastStop = max(m_delta[test].LastStop, rep.EndTime);
127 }
128 m_delta[test].CPU += rep.CPU;
129 m_delta[test].Elapsed = m_delta[test].LastStop - m_delta[test].FirstStart;
130 }
131
132 BonTimer::BonTimer()
133 : m_type(txt)
134 {
135 Initialize();
136 }
137
138 void
139 BonTimer::Initialize()
140 {
141 for(int i = 0; i < TestCount; i++)
142 {
143 m_delta[i].CPU = 0.0;
144 m_delta[i].Elapsed = 0.0;
145 }
146 timestamp();
147 }
148
149 int BonTimer::print_cpu_stat(tests_t test)
150 {
151 if(m_delta[test].Elapsed == 0.0)
152 {
153 if(m_type == txt)
154 fprintf(m_fp, " ");
155 else
156 fprintf(m_fp, ",");
157 return 0;
158 }
159 if(m_delta[test].Elapsed < MinTime)
160 {
161 if(m_type == txt)
162 fprintf(m_fp, " +++");
163 else
164 fprintf(m_fp, ",+++");
165 return 0;
166 }
167 int cpu = int(m_delta[test].CPU / m_delta[test].Elapsed * 100.0);
168 if(m_type == txt)
169 fprintf(m_fp, " %3d", cpu);
170 else
171 fprintf(m_fp, ",%d", cpu);
172 return 0;
173 }
174
175 int BonTimer::print_stat(tests_t test)
176 {
177 if(m_delta[test].Elapsed == 0.0)
178 {
179 if(m_type == txt)
180 fprintf(m_fp, " ");
181 else
182 fprintf(m_fp, ",");
183 }
184 else if(m_delta[test].Elapsed < MinTime)
185 {
186 if(m_type == txt)
187 fprintf(m_fp, " +++++");
188 else
189 fprintf(m_fp, ",+++++");
190 }
191 else
192 {
193 if(test == Lseek)
194 {
195 double seek_stat = double(Seeks) / m_delta[test].Elapsed;
196 if(m_type == txt)
197 {
198 if(seek_stat >= 1000.0)
199 fprintf(m_fp, " %5.0f", seek_stat);
200 else
201 fprintf(m_fp, " %5.1f", seek_stat);
202 }
203 else
204 fprintf(m_fp, ",%.1f", seek_stat);
205 }
206 else
207 {
208 int res = int(double(m_file_size) / (m_delta[test].Elapsed / 1024.0));
209 if(m_type == txt)
210 fprintf(m_fp, " %5d", res);
211 else
212 fprintf(m_fp, ",%d", res);
213 }
214 }
215 return print_cpu_stat(test);
216 }
217
218 int BonTimer::print_file_stat(tests_t test)
219 {
220 if(m_delta[test].Elapsed == 0.0)
221 {
222 if(m_type == txt)
223 fprintf(m_fp, " ");
224 else
225 fprintf(m_fp, ",");
226 }
227 else if(m_delta[test].Elapsed < MinTime)
228 {
229 if(m_type == txt)
230 fprintf(m_fp, " +++++");
231 else
232 fprintf(m_fp, ",+++++");
233 }
234 else
235 {
236 int res = int(double(m_directory_size) * double(DirectoryUnit)
237 / m_delta[test].Elapsed);
238 if(m_type == txt)
239 fprintf(m_fp, " %5d", res);
240 else
241 fprintf(m_fp, ",%d", res);
242 }
243
244 return print_cpu_stat(test);
245 }
246
247 void
248 BonTimer::PrintHeader(FILE *fp)
249 {
250 fprintf(fp, "name");
251 fprintf(fp, ",file_size,putc,putc_cpu,put_block,put_block_cpu,rewrite,rewrite_cpu,getc,getc_cpu,get_block,get_block_cpu,seeks,seeks_cpu");
252 fprintf(fp, ",num_files,seq_create,seq_create_cpu,seq_stat,seq_stat_cpu,seq_del,seq_del_cpu,ran_create,ran_create_cpu,ran_stat,ran_stat_cpu,ran_del,ran_del_cpu");
253 fprintf(fp, "\n");
254 fflush(NULL);
255 }
256
257 int
258 BonTimer::DoReport(CPCCHAR machine, int file_size, int directory_size
259 , int max_size, int min_size, int num_directories
260 , int chunk_size, FILE *fp)
261 {
262 m_fp = fp;
263 m_file_size = file_size;
264 m_directory_size = directory_size;
265 m_chunk_size = chunk_size;
266 const int txt_machine_size = 20;
267 if(m_file_size)
268 {
269 if(m_type == txt)
270 {
271 fprintf(m_fp, "Version %5s ", BON_VERSION);
272 fprintf(m_fp,
273 "------Sequential Output------ --Sequential Input- --Random-\n");
274 fprintf(m_fp, " ");
275 fprintf(m_fp,
276 "-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--\n");
277 if(m_chunk_size == DefaultChunkSize)
278 fprintf(m_fp, "Machine Size ");
279 else
280 fprintf(m_fp, "Machine Size:chnk ");
281 fprintf(m_fp, "K/sec %%CP K/sec %%CP K/sec %%CP K/sec %%CP K/sec ");
282 fprintf(m_fp, "%%CP /sec %%CP\n");
283 }
284 char size_buf[1024];
285 if(m_file_size % 1024 == 0)
286 sprintf(size_buf, "%dG", m_file_size / 1024);
287 else
288 sprintf(size_buf, "%dM", m_file_size);
289 if(m_chunk_size != DefaultChunkSize)
290 {
291 char *tmp = size_buf + strlen(size_buf);
292 if(m_chunk_size >= 1024)
293 sprintf(tmp, ":%dk", m_chunk_size / 1024);
294 else
295 sprintf(tmp, ":%d", m_chunk_size);
296 }
297 char buf[4096];
298 if(m_type == txt)
299 {
300 // copy machine name to buf
301 //
302 snprintf(buf
303 #ifndef NO_SNPRINTF
304 , txt_machine_size - 1
305 #endif
306 , "%s ", machine);
307 buf[txt_machine_size - 1] = '\0';
308 // set cur to point to a byte past where we end the machine name
309 // size of the buf - size of the new data - 1 for the space - 1 for the
310 // terminating zero on the string
311 char *cur = &buf[txt_machine_size - strlen(size_buf) - 2];
312 *cur = ' '; // make cur a space
313 cur++; // increment to where we store the size
314 strcpy(cur, size_buf); // copy the size in
315 fputs(buf, m_fp);
316 }
317 else
318 {
319 printf("%s,%s", machine, size_buf);
320 }
321 print_stat(Putc);
322 print_stat(FastWrite);
323 print_stat(ReWrite);
324 print_stat(Getc);
325 print_stat(FastRead);
326 print_stat(Lseek);
327 if(m_type == txt)
328 fprintf(m_fp, "\n");
329 }
330 else if(m_type == csv)
331 {
332 fprintf(m_fp, "%s,,,,,,,,,,,,,", machine);
333 }
334
335 if(m_directory_size)
336 {
337 char buf[128];
338 char *tmp;
339 sprintf(buf, "%d", m_directory_size);
340 if(max_size == -1)
341 {
342 strcat(buf, ":link");
343 }
344 else if(max_size == -2)
345 {
346 strcat(buf, ":symlink");
347 }
348 else if(max_size)
349 {
350 tmp = &buf[strlen(buf)];
351 sprintf(tmp, ":%d:%d", max_size, min_size);
352 }
353 if(num_directories > 1)
354 {
355 tmp = &buf[strlen(buf)];
356 sprintf(tmp, "/%d", num_directories);
357 }
358 if(m_type == txt)
359 {
360 if(m_file_size)
361 fprintf(m_fp, " ");
362 else
363 fprintf(m_fp, "Version %5s ", BON_VERSION);
364 fprintf(m_fp,
365 "------Sequential Create------ --------Random Create--------\n");
366 if(m_file_size)
367 fprintf(m_fp, " ");
368 else
369 fprintf(m_fp, "%-19.19s ", machine);
370 fprintf(m_fp,
371 "-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--\n");
372 if(min_size)
373 {
374 fprintf(m_fp, "files:max:min ");
375 }
376 else
377 {
378 if(max_size)
379 fprintf(m_fp, "files:max ");
380 else
381 fprintf(m_fp, " files ");
382 }
383 fprintf(m_fp, " /sec %%CP /sec %%CP /sec %%CP /sec %%CP /sec ");
384 fprintf(m_fp, "%%CP /sec %%CP\n");
385 fprintf(m_fp, "%19s", buf);
386 }
387 else
388 {
389 fprintf(m_fp, ",%s", buf);
390 }
391 print_file_stat(CreateSeq);
392 print_file_stat(StatSeq);
393 print_file_stat(DelSeq);
394 print_file_stat(CreateRand);
395 print_file_stat(StatRand);
396 print_file_stat(DelRand);
397 fprintf(m_fp, "\n");
398 }
399 else if(m_type == csv)
400 {
401 fprintf(m_fp, ",,,,,,,,,,,,,\n");
402 }
403 fflush(stdout);
404 return 0;
405 }
406