2 * Copyright (C) 2018-2020 Free Software Foundation, Inc.
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>. */
19 #include <sys/resource.h>
24 /* Filled when the timings start. */
25 struct timeval real_start
;
26 struct timeval user_start
;
27 struct timeval sys_start
;
28 /* Filled when the timings end. */
35 timing_start (struct timings_state
*ts
)
39 getrusage (RUSAGE_SELF
, &usage
);
40 ts
->user_start
= usage
.ru_utime
;
41 ts
->sys_start
= usage
.ru_stime
;
43 gettimeofday (&ts
->real_start
, NULL
);
47 timing_end (struct timings_state
*ts
)
49 struct timeval real_end
;
52 gettimeofday (&real_end
, NULL
);
54 getrusage (RUSAGE_SELF
, &usage
);
56 ts
->real_usec
= (real_end
.tv_sec
- ts
->real_start
.tv_sec
) * 1000000
57 + real_end
.tv_usec
- ts
->real_start
.tv_usec
;
58 ts
->user_usec
= (usage
.ru_utime
.tv_sec
- ts
->user_start
.tv_sec
) * 1000000
59 + usage
.ru_utime
.tv_usec
- ts
->user_start
.tv_usec
;
60 ts
->sys_usec
= (usage
.ru_stime
.tv_sec
- ts
->sys_start
.tv_sec
) * 1000000
61 + usage
.ru_stime
.tv_usec
- ts
->sys_start
.tv_usec
;
65 timing_output (const struct timings_state
*ts
)
67 printf ("real %10.6f\n", (double)ts
->real_usec
/ 1000000.0);
68 printf ("user %7.3f\n", (double)ts
->user_usec
/ 1000000.0);
69 printf ("sys %7.3f\n", (double)ts
->sys_usec
/ 1000000.0);
73 main (int argc
, char *argv
[])
77 fprintf (stderr
, "Usage: %s SIZE REPETITIONS\n", argv
[0]);
81 size_t size
= atol (argv
[1]);
82 int repeat
= atoi (argv
[2]);
84 char *memblock
= (char *) malloc (size
);
86 /* Fill the memory block. */
89 for (i
= 0; i
< size
; i
++)
91 (unsigned char) (((i
* (i
-1) * (i
-5)) >> 6) + (i
% 499) + (i
% 101));
94 struct timings_state ts
;
98 for (count
= 0; count
< repeat
; count
++)
101 FUNC (memblock
, size
, digest
);