usleep tests: Avoid failure due to known Cygwin 3.5.3 bug.
[gnulib.git] / tests / bench.h
blobb64e6c9d7c26a15e1ae5f7ad7bdf062dbfbaf822
1 /* Utilities for benchmarks.
2 Copyright (C) 2018-2024 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/>. */
17 #include <stdio.h>
18 #include <sys/resource.h>
19 #include <sys/time.h>
21 struct timings_state
23 /* Filled when the timings start. */
24 struct timeval real_start;
25 struct timeval user_start;
26 struct timeval sys_start;
27 /* Filled when the timings end. */
28 long real_usec;
29 long user_usec;
30 long sys_usec;
33 static void
34 timing_start (struct timings_state *ts)
36 struct rusage usage;
38 getrusage (RUSAGE_SELF, &usage);
39 ts->user_start = usage.ru_utime;
40 ts->sys_start = usage.ru_stime;
42 gettimeofday (&ts->real_start, NULL);
45 static void
46 timing_end (struct timings_state *ts)
48 struct timeval real_end;
49 struct rusage usage;
51 gettimeofday (&real_end, NULL);
53 getrusage (RUSAGE_SELF, &usage);
55 ts->real_usec = (real_end.tv_sec - ts->real_start.tv_sec) * 1000000
56 + real_end.tv_usec - ts->real_start.tv_usec;
57 ts->user_usec = (usage.ru_utime.tv_sec - ts->user_start.tv_sec) * 1000000
58 + usage.ru_utime.tv_usec - ts->user_start.tv_usec;
59 ts->sys_usec = (usage.ru_stime.tv_sec - ts->sys_start.tv_sec) * 1000000
60 + usage.ru_stime.tv_usec - ts->sys_start.tv_usec;
63 _GL_UNUSED static void
64 timing_output (const struct timings_state *ts)
66 printf ("real %10.6f\n", (double)ts->real_usec / 1000000.0);
67 printf ("user %7.3f\n", (double)ts->user_usec / 1000000.0);
68 printf ("sys %7.3f\n", (double)ts->sys_usec / 1000000.0);